链表在 2 个节点后停止,为什么?

Linked List Stops after 2 nodes, why?

首先post这里。我正在尝试使用下面的代码实现链表,但不知何故链表会在第二个节点之后停止。我期待 9->6->11->8->15->19->7->,但我只得到 9->6->。 谁能帮我弄清楚我的代码有什么问题? 谢谢!

class Node:
    def __init__(self,value):
        self.next = None
        self.val = value
    def __str__(self):
        return str(self.val)

class SLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
    def append_node(self,value):
        if self.head == None:
            self.head = self.tail = Node(value)  
        else:
            self.tail.next = Node(value)
            self.tail = Node(value)
        return self


llist = SLinkedList()
llist.append_node(9).append_node(6).append_node(11) \
.append_node(8).append_node(15).append_node(19) \
.append_node(7)  

print(llist.head.next.next) # returned None. Why??

如果将 self.tail = Node(value) 替换为 self.tail = self.tail.next,它将起作用。您当前的版本将 self.tail.next 设置为具有给定值的新节点,然后将 self.tail 设置为具有相同值的 不同的 节点。它们需要是相同的节点才能使链表正常工作。 self.tail.next 是一个 等价于 Node(value) 的节点,但是 Node(value) 创建了一个新对象。您需要它们都是同一个对象。如果它们不是同一个对象,self.tail 将是一个单独的对象,而不是链表的一部分。

self.head不为空时,append_node()正在创建两个新节点。它将一个放在旧尾巴的 next link 中,然后将 self.tail 设置为另一个。结果,self.tail 指向一个实际上不在 next 链中的节点。因此,当您稍后在其后添加新节点时,该节点不在列表中。

将新节点分配给一个变量,然后在两个地方都分配它。

    def append_node(self,value):
        new_node = Node(value)
        if self.head == None:
            self.head = self.tail = new_node
        else:
            self.tail.next = new_node
            self.tail = new_node
        return self
self.tail.next = Node(value)    
self.tail = Node(value)

这里你在两个节点中给出相同的 object,这不是实际需要的。你需要说,现在把 self.tail.next 作为尾巴,即 self.tail

因此将self.tail = Node(value)改为self.tail = self.tail.next

class SLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
    def append_node(self,value):
        if self.head == None:
            self.head = self.tail = Node(value)
        else:
            self.tail.next = Node(value)
            self.tail = self.tail.next
        return self