Python 双向链表节点移除
Python Doubly Linked List Node Removal
我在Python中创建了一个基本的双向链表class,它有三个方法:append、remove和show。 append方法我完全理解,show方法我完全理解。但是,我对删除方法的工作方式有点困惑。
这是我的两个 classes - 我的节点 class 和我的双向链表 class:
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 class 的删除方法时,该元素会按预期从列表中删除。但是,Node实例也没有了,我通过删除两个节点前后的这段代码验证了这一点。
import gc
for obj in gc.get_objects():
if isinstance(obj, ListNode):
print(obj.data)
现在,我想我只是不明白我的 remove 方法到底在做什么。
我的理解是这样的:
我认为该节点仍然存在,因为remove 方法只是重新分配先前节点的next 属性和后续节点的previous 属性。但是,当前节点没有改变,它仍然保留对列表中它旁边的节点的引用。
很明显,我的理解是错误的,我想知道为什么。
为什么我从链表中删除的节点实例消失了?
虽然节点持有对下一个和上一个的引用,但它没有任何指向它的东西,并且像 Python 中的任何对象一样被垃圾收集。你不得不使用 gc 只是为了检查它是否因为它没有推荐人而消失了!
我在Python中创建了一个基本的双向链表class,它有三个方法:append、remove和show。 append方法我完全理解,show方法我完全理解。但是,我对删除方法的工作方式有点困惑。
这是我的两个 classes - 我的节点 class 和我的双向链表 class:
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 class 的删除方法时,该元素会按预期从列表中删除。但是,Node实例也没有了,我通过删除两个节点前后的这段代码验证了这一点。
import gc
for obj in gc.get_objects():
if isinstance(obj, ListNode):
print(obj.data)
现在,我想我只是不明白我的 remove 方法到底在做什么。
我的理解是这样的:
我认为该节点仍然存在,因为remove 方法只是重新分配先前节点的next 属性和后续节点的previous 属性。但是,当前节点没有改变,它仍然保留对列表中它旁边的节点的引用。
很明显,我的理解是错误的,我想知道为什么。
为什么我从链表中删除的节点实例消失了?
虽然节点持有对下一个和上一个的引用,但它没有任何指向它的东西,并且像 Python 中的任何对象一样被垃圾收集。你不得不使用 gc 只是为了检查它是否因为它没有推荐人而消失了!