空循环链表插入新节点后无法显示数据,addEmpty函数异常求助
问题分析与解决方案
你的代码存在几个关键错误,导致插入的节点无法正常显示:
1. Node类属性定义错误
Node类里把指向下一个节点的属性写成了self.start,逻辑完全错误,应该改成self.nxt,否则所有节点的指针无法正确关联。
2. 循环链表初始化逻辑混乱
原cLL的__init__方法创建了两个空Node并互相指向,这会让链表的空状态判断变得复杂,后续插入节点后,初始的空节点还会干扰遍历。正确的空循环链表应该让start和last都设为None。
3. addEmpty函数的判断条件错误
原代码用self.start.data == None判断空链表,初始化修改后,空链表的start本身就是None,所以应该判断self.start is None才能正确识别空状态。
4. display函数遍历逻辑错误
原循环条件tmp.nxt != self.last.nxt完全错误——循环链表中last.nxt就是start,这个条件会跳过第一个节点,还无法正确终止循环。正确的遍历应该从start开始,直到回到start节点为止,同时要处理空链表的情况。
5. addEnd函数的边界处理缺失
当链表为空时调用addEnd,原代码只打印提示不执行插入,应该直接调用addEmpty处理这种情况。
修正后的完整代码
class Node: def __init__(self, data): self.data = data # 修正:将start改为nxt,作为指向下一个节点的指针 self.nxt = None class cLL: def __init__(self): # 修正:空链表时start和last都设为None self.start = None self.last = None def addEmpty(self, val): nu = Node(val) # 修正:判断链表是否为空的正确方式 if self.start is None: self.start = nu self.last = nu nu.nxt = self.start return nu def addEnd(self, val): # 修正:如果链表为空,直接调用addEmpty if self.start is None: self.addEmpty(val) else: nu = Node(val) self.last.nxt = nu self.last = nu nu.nxt = self.start def display(self): # 处理空链表情况 if self.start is None: print("链表为空") return tmp = self.start # 修正:遍历直到回到start节点 while True: print(tmp.data) tmp = tmp.nxt if tmp == self.start: break rew = cLL() rew.addEmpty(23) rew.addEnd(30) rew.addEnd(90) rew.addEnd(900) rew.display()
运行后会正确输出:
23 30 90 900
内容的提问来源于stack exchange,提问作者user3521180
相关产品推荐
相关产品推荐

