所以我从头开始实现了一个链表,并试图删除当前节点(游标)。当我运行程序并尝试删除当前节点时,我不会收到任何错误,但我会尝试打印当前节点(现在应该是下一个或上一个),它会打印应该删除的节点。
首先,这一行毫无意义:
// ...
}else{
cursor = cursor.getPrev().getNext(); // THIS LINE - all you say here is 'cursor = cursor'
cursor = cursor.getNext();
}
// ...
您可能想断开前一个节点指向光标的连接,并使其指向光标后的节点:
// get previous node and set its next to node after cursor
cursor.getPrev().setNext(cursor.getNext());
本部分:
if(cursor.getNext() == null){ //it's the tail
tail = cursor.getPrev();
}
你永远不会通过说tail.next = null
来断开tail.next
,所以你的tail.next
在更新后会指向cursor
然后这行:
else{
cursor = cursor.getNext().getPrev(); // again no effect
cursor = cursor.getPrev();
}
应该看起来像:
// get next node and set its prev to node before cursor
cursor.getNext().setPrev(cursor.getPrev());
总的来说,你的逻辑似乎比它应该的要复杂得多
您可以稍微重新排序if
语句,使其更加清晰。你应该先检查边缘情况(头部和尾部),然后检查其余情况:
if (cursor != null){
if(cursor.getPrev() == null){ //it's the head
head = cursor.getNext();
head.setPrev(null); // disconnect the head from current node
} else if (cursor.getNext() == null) { // it's the tail
tail = cursor.getPrev();
tail.setNext(null); // disconnect the tail from current node
} else { // regular node
Node prev = cursor.getPrev();
prev.setNext(next); // connect previous node to next node
Node next = cursor.getNext();
next.setPrev(prev); // connect next node to previous node
}
// this part isn't necessary because we are skipping the cursor node
// so nothing in the list references to it anymore
// however it is a good safety measure and it helps the GC a bit
cursor.setPrev(null); // disconnect cursor from previous node
cursor.setNext(null; // disconnect cursor from next node
}
我省略了光标的更新,因为当光标位于中间节点并将其删除时,会出现一种模糊的情况。问题是如何决定将光标更新为prev
或next
?
你并不真的需要光标,但我已经把这个答案挤塞了很多,所以我会给你this link
和this link
看看,看看有什么好主意。
至于格式化你的长打印:
如果您正在使用Eclipse,您可以在Windows上使用Ctrl-Shift-F
或在Mac上使用Cmd-Shift-F
来自动格式化您的代码:)
我怀疑你打给的电话
cursor = cursor.getPrev().getNext();
(假设光标是列表中要删除的元素)没有做任何事情,因为cursor
应该已经==cursor.getPrev().getNext()
我怀疑你想做的是
cursor.getPrev().setNext(cursor.getNext()); // note SET instead of GET
cursor.getNext().setPrev(cursor.getPrev());