[英]Why I can't create a linked list with a circle?
我正在嘗試創建一個像這樣的無限圓的鏈表0->1->2->3->4->5-**>2**->3->4->5-**>2**->3->4->5->.........
,下面是我的代碼:
class node():
def __init__(self, val):
self.val = val
self.nextNode = None
def __repr__(self):
return "%s" % self.val
class linkedList():
def __init__(self):
self.head = None
def addNode(self, nodeVal):
newNode = node(nodeVal)
if self.head is None:
self.head = newNode
else:
tmp = self.head
while tmp.nextNode is not None:
tmp = tmp.nextNode
tmp.nextNode = newNode
def linkNode(self, node):
if self.head is None:
raise Exception("list can't be None")
tmp = self.head
while tmp.nextNode is not None:
tmp = tmp.nextNode
tmp.nextNode = node
def __repr__(self):
tmp = self.head
val = []
while tmp is not None:
val.append(tmp.val)
tmp = tmp.nextNode
return "vals are %s" % val
s = linkedList()
head = node(0)
node1 = node(1)
node2 = node(2)
node3 = node(3)
node4 = node(4)
node5 = node(5)
s.addNode(head)
s.addNode(node1)
s.addNode(node2)
s.addNode(node3)
s.addNode(node4)
s.addNode(node5)
s.linkNode(node2)
print(s)
但是 output 是這樣的:vals are [0, 1, 2, 3, 4, 5, 2]
這不是一個圓圈。
發生這種情況是因為在addNode
中,您正在創建一個新節點
newNode = node(nodeVal)
這意味着當您稍后將 node2 傳遞給linkNode
時,它仍然是由class Node
創建的nextNode=None
節點
只需刪除該行,您就可以使用 go。
需要一個小細節,然后它應該可以按您的意願工作。
s.linknode(s.head.nextNode.nextNode)
替換你的行s.linkNode(node2)
)然后打印循環中的第 x 個元素,使用以下命令:
tmp = s.head
for i in range(x):
print(tmp.val)
tmp = tmp.nextNode
print(s)
,因為這會在循環中做一個無限循環前一個不起作用的原因是您在 function addNode()
中有以下newNode = node(nodeVal)
因此它創建了與列表沒有連接的新節點。
由於您的方法addNode
需要一個值,並將為其創建一個節點,因此您不應使用節點作為參數來調用它。
因此,在不改變您的 class 方法的情況下,您的主要代碼可能如下所示。 順便說一句,我發現s
列表的名稱不好——它通常用於字符串——所以我將它命名為lst
:
lst = linkedList()
lst.addNode(0)
lst.addNode(1)
lst.addNode(2)
lst.addNode(3)
lst.addNode(4)
lst.addNode(5)
lst.linkNode(lst.next.next)
print(lst)
不相關,但這里有一些改進 class 的方法:
由於addNode
每次都需要遍歷整個列表,因此您的鏈表最好保持對尾節點的引用。 這樣你就可以在恆定時間內 append 最后一個新節點。
addNode
還可以返回新添加的節點,因此您可以稍后將其用於調用linkNode
以下是您的代碼在實現這些想法后的樣子:
def __init__(self):
self.head = None
self.tail = None
def addNode(self, nodeVal):
newNode = node(nodeVal)
if self.head is None:
self.head = newNode
else:
self.tail.next = newNode
self.tail = newNode
return newNode
def linkNode(self, node):
if self.head is None:
raise Exception("list can't be None")
self.tail.next = node
# Main code
lst = linkedList()
lst.addNode(0)
lst.addNode(1)
backref = lst.addNode(2)
lst.addNode(3)
lst.addNode(4)
lst.addNode(5)
lst.linkNode(backref)
print(lst)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.