循环链表手动创建节点后调用atStart函数添加首节点失败问题
循环链表头部添加节点失效问题修复
问题核心原因
- 手动构建链表时未初始化
tail属性:你手动创建3个节点并关联后,没有将cll.tail指向最后一个节点e3,导致atStart中处理非空链表的代码块(if self.tail:)因条件不满足而跳过,新节点根本没被加入链表。 - 原
atStart未更新头部指针:即使tail正确初始化,原函数也没把self.head更新为新节点,打印时仍从旧头部开始遍历,无法访问到新添加的节点。
修复后的完整代码
class Node: def __init__(self, data): self.data = data self.ref = None class CircularLinkedList: def __init__(self): self.head = None self.tail = None def atStart(self, newData): newNode = Node(newData) if self.head is None: # 空链表:新节点既是头也是尾,自循环 self.head = newNode self.tail = newNode self.tail.ref = newNode else: # 非空链表:插入新节点到头部 newNode.ref = self.tail.ref # 新节点指向原头部 self.tail.ref = newNode # 尾节点指向新节点,完成循环 self.head = newNode # 更新头部指针为新节点 def printList(self): if self.head is None: print("Circular linked list is empty") return current = self.head while True: print(current.data) current = current.ref if current == self.head: break # 测试代码 cll = CircularLinkedList() cll.head = Node("Monday") e2 = Node("Tuesday") e3 = Node("Wednesday") cll.head.ref = e2 e2.ref = e3 e3.ref = cll.head cll.tail = e3 # 必须手动设置tail,否则atStart无法识别非空状态 cll.atStart("Sunday") cll.atStart("New Monday") cll.printList()
关键修复点说明
- 补全手动构建的tail初始化:添加
cll.tail = e3,让链表的tail属性正确指向最后一个节点,确保atStart能进入非空链表处理逻辑。 - 更新头部指针:在非空链表的处理分支中新增
self.head = newNode,这样打印时会从新添加的节点开始遍历,完整输出所有节点。 - 优化遍历逻辑:将
printList的循环改为while True,结合current == self.head的终止条件,更贴合循环链表的遍历特性。
内容的提问来源于stack exchange,提问作者Pulkit
相关产品推荐
相关产品推荐

