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

第一次发帖在这里。我正在尝试使用下面的代码实现链表,但不知何故链表会在第二个节点之后停止。我期待 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??


陪伴而非守候
浏览 168回答 3
3回答

慕姐4208626

self.tail.next = Node(value)    self.tail = Node(value)在这里,您将同一个对象放在两个节点中,这并不是实际需要的。你需要说,现在做self.tail.next尾巴,即self.tail因此self.tail = Node(value)改为self.tail = self.tail.nextclass 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

慕斯王

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旧尾巴的链接中,然后设置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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python