我熟悉从Python中的双向链表中删除Node的一般方法,如下所示:
current.prev.next = current.next
current.next.prev = current.prev
current.next = None
current.prev = None
我有一个名为" current"在链表中间的某个地方。我的目标是删除Node并拥有新的" current"成为之后的节点。我已经编写了完成此任务的代码,但它留下了一些无用的引用。
current = current.next
current.prev.prev.next = current
current.prev = current.prev.prev
从这里开始,列表的顺序正确,没有引用指向已删除的节点,但删除的节点仍然将其.next和.prev引用指向列表。这对我来说似乎是不好的代码,但由于我没有对已删除的节点进行任何引用,因此我不知道如何访问它以删除它们。
这些参考文献是否有问题?如果是,那么解决方案是什么?
答案 0 :(得分: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化,则可以删除第5行和第6行。