【问题标题】:Removing a Node from a doubly linked list while maintaining position在保持位置的同时从双向链表中删除节点
【发布时间】:2015-04-21 08:37:22
【问题描述】:

我熟悉从 Python 中的双向链表中删除节点的一​​般方法,如下所示:

current.prev.next = current.next
current.next.prev = current.prev
current.next = None
current.prev = None

我在链表中​​间的某处有一个名为“current”的节点。我的目标是删除节点并让新的“当前”成为它之后的节点。我已经编写了完成此操作的代码,但它留下了一些无用的引用。

current = current.next
current.prev.prev.next = current   
current.prev = current.prev.prev   

从这里开始,列表的顺序正确,没有引用指向已删除的节点,但已删除的节点仍有其 .next 和 .prev 引用指向列表。这对我来说似乎是糟糕的代码,但由于我没有对已删除节点的任何引用,我不知道如何访问它以删除它们。

这些引用甚至是一个问题吗?如果有,解决办法是什么?

【问题讨论】:

    标签: python python-3.x linked-list doubly-linked-list garbage


    【解决方案1】:

    如果被删除的节点立即被垃圾回收,那么它的死链接就会消失并且不会引起问题。如果没有其他对它的引用,但它被保留(如在 CPython 以外的解释器中),那么它的死引用将保持 .prev 和 .next 活着而不是 gc'ed,即使它们可能存在。如果还有其他对节点的引用,那么它的错误引用可能是个问题。

    对我来说,最简洁的过程是只关注每个链接一次,然后按如下方式扩充您的代码。

    next = current.next
    prev = current.prev
    prev.next = next
    next.prev = prev
    current.next = None
    current.prev = None
    current = next
    

    如果您知道第 7 行会导致前一个当前节点被 gc'ed,则可以删除第 5 行和第 6 行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多