我实现了选择排序,我需要交换元素。
我有以前和下一个链接的双重链接列表。
并链接到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
节点之后排序后不会覆盖任何元素。
答案 0 :(得分:2)
您还需要更新2被交换的节点
例如,请考虑以下列表:
首先 - > a - > b - > ç
如果您希望先交换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
}