簡體   English   中英

為什么我不能創建帶圓圈的鏈表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM