我实现了选择排序,我需要交换元素。我有双重链表与前一个和下一个链接。并链接到List中的第一个和最后一个元素我总是需要交换节点b
和第一个节点toStartFrom
public void Swap(Node toStartFrom, Node b) {
Boolean NextToEachOther = (toStartFrom.next == b);
toStartFrom.next = b.next;
b.previous = toStartFrom.previous;
if (NextToEachOther) {
toStartFrom.previous = b;
b.next = toStartFrom;
} else {
toStartFrom.previous = b.previous;
b.next = toStartFrom.next;
}
}
public void display() {
Node current = first;
while (current != null) {
...printing...
current = current.next;
}
}
但是它不起作用。没有错误只是没有按正确的顺序排序。且不显示toStartFrom
节点后排序的任何元素
您还需要更新被交换的2旁边的节点
例如,考虑这个列表:
first -> a -> b -> c
如果你想先交换b,那么你也必须更新a和c的下一个和前一个引用。
编辑:这段代码应该放在你做交换的代码之前和布尔声明之后
Edit2:另外,如果您有对列表的头/尾的引用,您也需要更新这些引用。我没有看到你在你的代码中引用了头或尾。
if(toStartFrom.prev != null)
{
toStartFrom.prev.next = b;
}
if(toStartFrom.next != b) // Equivalent to NextToEachOther
{
toStartFrom.next.prev = b;
}
if(b.next != null)
{
b.next.prev = toStartFrom;
}
if(b.prev != toStartFrom) // Equivalent to NextToEachOther
{
b.prev.next = toStartFrom
}