Java - 手动链表,删除当前节点

时间:2014-09-23 02:20:37

标签: java linked-list doubly-linked-list

所以我从头开始实现一个链表,并试图删除当前节点(游标)。当我运行程序并尝试删除当前节点时,我没有收到任何错误,但是我将尝试打印当前节点(现在应该是下一个或上一个节点)并打印出应该存在的节点已被删除。

2 个答案:

答案 0 :(得分:3)

首先,这条线毫无意义:

// ...
}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.nexttail.next = nulltail.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

我省略了光标的更新,因为当光标位于中间节点上并且您将其删除时存在一种不明确的情况。问题是您如何决定将光标更新为nextCtrl-Shift-F

你真的不需要光标,但我已经拥挤了这个答案,所以我会给你this linkthis link检查一下好主意。

格式化长版:

如果您使用的是Eclipse,则可以在Windows上使用Cmd-Shift-F或在Mac上使用{{1}}自动格式化代码:)

答案 1 :(得分:1)

我怀疑你打电话给

cursor = cursor.getPrev().getNext(); 

(假设光标是您要删除的列表中的元素) 没有做任何事情,因为cursor已经 == cursor.getPrev().getNext()

我怀疑你想做的是

 cursor.getPrev().setNext(cursor.getNext()); // note SET instead of GET
 cursor.getNext().setPrev(cursor.getPrev());