【问题标题】:Linked List Stops after 2 nodes, why?链表在 2 个节点后停止,为什么?
【发布时间】:2020-08-29 03:34:24
【问题描述】:

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

【问题讨论】:

    标签: python linked-list singly-linked-list


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      self.tail.next = Node(value)    
      self.tail = Node(value)
      

      在这里,您将相同的对象放在两个节点中,这不是实际需要的。您需要说,现在将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
      

      【讨论】:

        【解决方案3】:

        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
        

        【讨论】:

        • 谢谢!我想我现在明白了。哇,没想到我的问题这么快就得到了很多人的回答。这是一个很棒的社区!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多