我正在尝试实现LinkedLists,但由于某种原因,我无法完全理解"self-head;下面函数的第一个版本不起作用,但只是简单地存储";self.head";在";n〃——但只在else子句之后?——使其工作。这些功能不应该在功能上完全相同吗?
我想";self.head";只是指你在浏览列表时所处的位置,那么说:";Self.head是当前节点,所以Self.head.next是下一个节点"以及";n=self-head.n是当前节点,那么n.next是下一个节点";?
# Doesn't work:
def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
while self.head.next is not None:
self.head = self.head.next
self.head.next = new_node
# Works:
def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
n = self.head
while n.next is not None:
n = n.next
n.ref = new_node
在第一个版本中,您实际上是在移动"head",这是不应该做的,因为在链表的情况下,"head’应该始终指向第一个节点。此外,在这样做的同时,您实际上正在失去以前的节点。让我们使用函数的第一个版本运行一个简单的场景。假设您在链表中添加了三个值:2,3,4,因此"append"函数应该调用三次:
append(2(:"if"条件为true,"self.head"将指向"2">,self.head.next将为"None"。因此,可以说,我们目前的linked_list将是:'2->无
append(3(: self.head仍将指向'2',但在这种情况下,else内部的代码将被执行,但while循环不会被执行,因为'self.head.next'实际上是'None'。因此,将添加新节点,我们的链接列表将变为:'2->3->None’*请注意,"self.head"仍然没有移动到下一个节点。
append(4(:现在,在else子句中,当执行循环时,"self.head"将在执行"self-head=self.head.next"后指向"3",一旦没有引用第一个节点(2(,当我们将头移到下一个节点时,该节点将丢失(不可访问(,在附加4之后,您在末尾的链表实际上将是:3->4->现在没有"self.head"指向"3"。你应该记住,在Python中,只要至少有一个对对象的引用,对象就会保持活动状态。每次在第二个节点之后添加节点时,你的第一个版本的append函数实际上都会失去对head节点的引用。