繁体   English   中英

如何在循环链表中的给定节点之后添加节点?

[英]how to add a node after a given node in circular linked list?

下面是在给定节点之后添加节点的代码片段。 但是,它不起作用。 据我了解,节点的添加方式与我们在单链表中添加节点的方式相同。 因此,我尝试实施一些更改,但没有用。

class Node:
    def __init__(self, data):
        self.data = data
        self.nxt = self
        

class cirLL:
    def __init__(self):
        self.lst = None
        
    def addEnd(self, val):
        nu = Node(val)
        if self.lst is None:
            self.lst = nu
        else:
            nu.nxt = self.lst.nxt
            self.lst.nxt = nu
            self.lst = nu
    
  
    def addaftr(self, pos, val):
        tmp = self.lst.nxt
        while tmp != self.lst:
            if tmp.data == pos:
                break
            tmp = tmp.nxt
        if tmp is None:
            print(pos, "not present")
        else:
            nu = Node(val)
            nu.nxt = tmp.nxt
            tmp.nxt = nu
    
    def disply(self):
        if not self.lst:
            return  # nothing to print
        tmp = self.lst.nxt
        print(tmp.data)
        while tmp != self.lst:
            tmp = tmp.nxt
            print(tmp.data)
                
               
rew = cirLL()
rew.addaftr(30, 456)
rew.addEnd(23)
rew.addEnd(30)
rew.addEnd(90)
rew.disply()

我收到以下错误:

AttributeError: 'NoneType' object has no attribute 'nxt'

不确定可能出了什么问题。 请建议。

问题很明显:

    tmp = self.lst.nxt

上面的语句假设self.lst不是None ,但最初它是。 因此,你得到了你得到的错误。

就像addEnd方法一样,您应该首先测试self.lst是否可能是None并采取相应的行动。

您可以按如下方式修复它:

def addaftr(self, pos, val):
    if self.lst is None:
        print(pos, "not present")
        return
    # rest of your code

其他说明:

  • 名称pos具有误导性。 首先我认为该方法旨在在列表中的position处插入一个节点,但事实证明pos是一个列表而不是position

  • 当您的列表中还没有节点时,您想在值30之后插入一个节点有点奇怪。 你真的是故意的吗?

  • 另一个问题是这种情况永远不会成立:

     if tmp is None

    由于您的列表是循环的, tmp只会lst第一个节点,但它永远不会变成None 此外,您的循环不会检查列表中的最后一个节点是否有您要查找的数据。 if应该替换为:

     if tmp.data:= pos:
  • 当要查找的值恰好在最后一个节点时,则在插入后需要将lst引用适配为新插入的节点。 所以在else块的末尾添加:

     if tmp == self.lst: self.lst = nu

这是更正后的代码:

    def addaftr(self, findval, val):
        if self.lst is None:
            print(findval, "not present")
            return
        tmp = self.lst.nxt
        while tmp != self.lst:
            if tmp.data == findval:
                break
            tmp = tmp.nxt
        if tmp.data != findval:
            print(findval, "not present")
        else:
            nu = Node(val)
            nu.nxt = tmp.nxt
            tmp.nxt = nu
            if tmp == self.lst:
                self.lst = nu

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM