链表在 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
首先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