【问题标题】:Python Doubly Linked List Node RemovalPython双向链表节点删除
【发布时间】:2015-05-03 02:18:29
【问题描述】:

我在 Python 中创建了一个基本的双向链表类,它具有三个方法:append、remove 和 show。 append 方法我完全理解,show 方法我完全理解。但是,我对我的 remove 方法的工作方式有点困惑。

这是我的两个类 - 我的 Node 类和我的双向链表类:

class ListNode:
    def __init__(self, data, prev, next):
        self.data = data
        self.prev = prev
        self.next = next

class DoubleList(object):
    head = None
    tail = None

    def append(self, data):
        new_node = ListNode(data, None, None)
        if self.head is None:
            self.head = self.tail = new_node
        else:
            new_node.prev = self.tail
            new_node.next = None
            self.tail.next = new_node
            self.tail = new_node

    def remove(self, node_value):
        current_node = self.head
        while current_node is not None:
            if current_node.data == node_value:
                if current_node.prev is not None:                   
                    current_node.prev.next = current_node.next
                    current_node.next.prev = current_node.prev
                else:
                    self.head = current_node.next
                    current_node.next.prev = None
            current_node = current_node.next
    def show(self):

        print("Show list data:")
        current_node = self.head
        while current_node is not None:
            print(current_node.prev.data if hasattr(current_node.prev, "data") else None,)
            print(current_node.data)
            print(current_node.next.data if hasattr(current_node.next, "data") else None)
            current_node = current_node.next
        print("*"*50)

因此,当我使用属于我的 DoubleList 类的 remove 方法时,该元素会按预期从列表中删除。但是,Node 实例也消失了,我在删除两个节点之前和之后使用这段代码验证了这一点。

import gc
for obj in gc.get_objects():
    if isinstance(obj, ListNode):
        print(obj.data)

现在,我假设我根本不明白我的 remove 方法在做什么。

我的理解是这样的:

我认为该节点仍然存在,因为 remove 方法仅重新分配前一个节点的下一个属性和后一个节点的前一个属性。但是,当前节点并没有改变,它仍然持有对列表中它旁边的节点的引用。

显然,我的理解是错误的,我想知道为什么。

为什么我从链表中删除的节点实例消失了?

【问题讨论】:

    标签: python oop data-structures linked-list


    【解决方案1】:

    虽然节点包含对下一个和前一个的引用,但它没有任何指向它的东西,并且像 Python 中的任何对象一样被垃圾收集。您必须使用 gc 来检查它是否因为没有引荐来源而消失!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多