从链接列表中间删除时是否有必要隔离节点?

时间:2013-10-20 08:22:12

标签: algorithm data-structures singly-linked-list doubly-linked-list

我们只是让前一个节点指向下一个节点。

prev.next = next;
return current;

或隔离节点

prev.next = next;
current.next = null;
return current;    

仍然可以遍历剩余的列表,如果我们有删除的节点,则使用下一个指针。 在双重链接列表中怎么样?

2 个答案:

答案 0 :(得分:1)

理论上

最重要的是,列表不变量在删除后保持不变。那是

  • 没有圈子,
  • 每个节点指向下一个节点(除非该节点是最后一个节点),
  • 在双向链表中,每个节点都是其前身的后继节点(除非节点是第一个节点),
  • 在双向链表中,每个节点都是其后继节点的前身(除非节点是最后一个节点),.

列表不变量没有说明不属于列表的节点,因此在删除期间是否设置current.next = null并不重要。

在parctice

保留current.next可能会阻碍自动垃圾收集,因为可能存在不再需要的对象引用。但这取决于具体情况。

在没有自动垃圾收集的语言中,存在拥有另一个对象的概念。 拥有另一个对象的对象负责管理该另一个对象的资源(例如,另一个对象占用的内存)。删除拥有对象时,拥有者必须删除拥有的对象。在这种情况下,如果您在删除current.next = null之前未设置current,则会删除不应删除的其他对象。

答案 1 :(得分:0)

没有真正的理由'隔离'节点。一旦将上一个节点的下一个指针设置为下一个节点,就可以“隔离”当前节点,因为无法从列表头找到它。假设您没有自动垃圾收集,则需要将其删除。

使用双向链表时,您还需要更新current.next的上一个指针。一旦你替换了指向旧的当前节点的所有节点指针,你就完成了从列表中拼接它并且它将不再可以找到。

在这个例子中,我们从单链和双链表中删除'b'节点。 括号中的箭头是需要更新的箭头。

   [a] (->) [b] -> [c]    would become    [a] -> [c]

[a] <(->) [b] (<-)> [c]   would become   [a] <-> [c]