【问题标题】:Understanding "self.head" in singly linked-list了解单链表中的“self.head”
【发布时间】:2021-06-22 05:11:15
【问题描述】:

我正在尝试练习实现 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 的“引用”复制到 n 并移动 n 而不是 head。所以简而言之,第一个函数使用head作为当前节点(移动的节点),而第二个函数使用n

标签: python-3.x linked-list singly-linked-list


【解决方案1】:

在第一个版本中,您实际上是在移动不应该这样做的“头”,因为在链表的情况下,“头”应该始终指向第一个节点。同样在这样做的同时,您实际上正在丢失以前的节点。让我们使用您的函数的第一个版本运行一个简单的场景。 假设您在链表中添加了三个值:2,3,4,因此应该调用 'append' 函数 3 次:

追加(2): 'if' 条件为真,'self.head' 将指向'2',self.head.next 将是'None'。所以只是说,我们现在的linked_list将是: '2 -> 无'

追加(3): self.head 仍将指向 '2' 但在这种情况下,else 中的代码将被执行,但 while 循环不会被执行,因为 'self.head.next' 实际上是 'None'。所以新节点将被添加,我们的链表将变为: '2 -> 3 -> None' *请注意,'self.head' 仍然没有移动到下一个节点。

追加(4): 现在在这里,在 else 子句中,将执行 while 循环,在执行 'self.head = self.head.next' 之后,'self.head' 将指向 '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。每次在第二个节点之后添加一个节点时,您的第一个版本的 append 函数实际上都会丢失对头节点的引用。

【讨论】:

    猜你喜欢
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多