双向链表,删除节点

时间:2018-03-23 04:43:42

标签: java linked-list

我可以理解第2-8行,遍历并重新分配节点的指针,但我不知道为什么temp.next和temp.prev被设置为null。是要删除临时节点吗?

2 个答案:

答案 0 :(得分:0)

以下是删除

之前链表的表示
-------      -------       -------
|node1| <=> | node2 | <=> | node3 |
-------      -------       -------

执行后(删除node2)

temp.next.prev = temp.prev;  
temp.prev.next = temp.next; 
-------     -------      -------
|node1| <- | node2 | -> | node3 |
-------     -------      -------
  ^ |                     ^ |
  | |_____________________| |                     
  |_________________________|

node2仍有两个活动指针并不重要,最终将由垃圾收集器收集,因此不需要将其nextprev设置为null。

注意:您的代码不适用于删除头部或尾部节点(因为它们的prev和next分别为null)。

您可以在上述两个陈述之前添加if支票(temp.next != nulltemp.prev != null)。

或者您可以在开头和结尾添加一个标记虚拟节点,这将简化您的代码并避免需要这样的if条件。

答案 1 :(得分:0)

最好可视化列表以及上一页和下一页,看看这里发生了什么:

在第5行之后,我们遇到类似this的情况。

第8行tmp从列表中删除后,但仍然有指向列表中元素的指针。它看起来像this

接下来的两行&#34;删除&#34;这些指针导致this

公平地说,我真的没有理由去做最后一步。通常不应该再对被删除的元素进行引用,因此无论如何它都应该被垃圾收集,而剩下的引用并不重要。但我想这个问题只询问代码的作用。所以基本上这些行只是删除了已删除元素到列表元素的引用。