理解单链表中的 "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 中。每次在第二个节点之后添加一个节点时,您的附加函数的第一个版本实际上会丢失对头节点的引用。