我在java中为一个双向链表编写了以下插入排序例程,它将节点中的数据交换为排序&它工作正常。但是,我试图弄清楚如何实际交换节点链接以实现插入排序。我尝试了许多选项,但都失败了,因为它是节点所引用的对象引用,因此更改它们会弄乱并破坏列表。任何指针将不胜感激。
节点类(内部类):
private class Node {
T data;
Node next;
Node prev;
}
排序例程
public void sort() {
if(isEmpty()) {
throw new RuntimeException("List is empty");
}
Node current = head;
while(current != null) {
for(Node prev=current; prev.prev != null; prev = prev.prev) {
if(prev.data.compareTo(prev.prev.data) <= 0) {
T tmp = prev.data;
prev.data = prev.prev.data;
prev.prev.data = tmp;
}
}
current = current.next;
}
}
编辑1:
感谢 lhuang 提供交换节点的方法。有用。实际答案在于 Java 按值复制和传递引用,而不是对象(请参阅http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html)。因此,您应该将节点交换传递给其他方法,而不是在同一个地方尝试,因此它不会影响除要交换的两个节点之外的其余节点。
我将例程修改为以下
public void sort() {
if(isEmpty()) {
throw new RuntimeException("List is empty");
}
Node current = top;
while(current != null) {
for(Node prev=current; prev != null && prev.prev != null; prev = prev.prev) {
if(prev.data.compareTo(prev.prev.data) <= 0) {
swap(prev,prev.prev);
}
}
current = current.next;
}
}
具有此逻辑的最后一个问题是,在交换时电流总是落后,并且在此逻辑中处理了两次相同的两个节点。有没有办法减轻这种情况,即交换后将电流恢复到原来的位置?