理解单链表中的 "self.head"
Understanding "self.head" in singly linked-list
我正在尝试练习实现 LinkedList,但出于某种原因无法完全理解“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' 函数应被调用三次:
附加(2):
'if' 条件将为真,'self.head' 将指向 '2' 并且 self.head.next 将是 'None'。所以只是说,我们现在的 linked_list 将是:
'2 -> None'
附加(3):
self.head 仍将指向 '2' 但在这种情况下,将执行 else 中的代码但不会执行 while 循环,因为 'self.head.next' 是 'None' 实际上。因此将添加新节点,我们的链表将变为:
'2 -> 3 -> None' *注意 'self.head' 还没有移动到下一个节点。
附加(4):
现在在这里,在 else 子句中,将执行 while 循环,'self.head' 将在执行 'self.head = self.head.next' 后指向 '3' 并且一旦没有对第一个节点(2)的引用,当我们将头部移动到下一个节点时,该节点将丢失(不可访问)并且在附加 4 之后,最后的链表实际上是:
3 -> 4 -> None 现在 'self.head' 指向 '3'。
你应该记得在 Python、An object stays alive, as long as there is at least one reference to it 中。每次在第二个节点之后添加一个节点时,您的附加函数的第一个版本实际上会丢失对头节点的引用。
我正在尝试练习实现 LinkedList,但出于某种原因无法完全理解“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' 函数应被调用三次:
附加(2): 'if' 条件将为真,'self.head' 将指向 '2' 并且 self.head.next 将是 'None'。所以只是说,我们现在的 linked_list 将是: '2 -> None'
附加(3): self.head 仍将指向 '2' 但在这种情况下,将执行 else 中的代码但不会执行 while 循环,因为 'self.head.next' 是 'None' 实际上。因此将添加新节点,我们的链表将变为: '2 -> 3 -> None' *注意 'self.head' 还没有移动到下一个节点。
附加(4): 现在在这里,在 else 子句中,将执行 while 循环,'self.head' 将在执行 'self.head = self.head.next' 后指向 '3' 并且一旦没有对第一个节点(2)的引用,当我们将头部移动到下一个节点时,该节点将丢失(不可访问)并且在附加 4 之后,最后的链表实际上是: 3 -> 4 -> None 现在 'self.head' 指向 '3'。 你应该记得在 Python、An object stays alive, as long as there is at least one reference to it 中。每次在第二个节点之后添加一个节点时,您的附加函数的第一个版本实际上会丢失对头节点的引用。