Python双向链表程序无限循环致编译器崩溃的原因排查
问题原因分析
问题出在add_before方法的指针赋值逻辑错误,导致链表节点间形成循环引用,最终触发无限循环。
具体来看add_before方法中的这段错误代码:
new_node.pref = n new_node.nref = n.pref
这里把新节点的前驱(pref)和后继(nref)指针完全搞反了。正确的逻辑应该是:
- 新节点的后继(
nref)指向目标节点n - 新节点的前驱(
pref)指向目标节点原来的前驱(n.pref)
当前错误的赋值逻辑会让新节点的pref指向目标节点n,nref指向n的旧前驱(在你的测试场景中,目标节点是30,它的旧前驱是None)。接着执行n.pref = new_node后,目标节点n的pref又指向新节点,形成了新节点↔目标节点的循环引用(新节点的pref是目标节点,目标节点的pref是新节点)。
当调用print_LL_reverse时,遍历到新节点40后,会通过n = n.pref回到30,接着又从30的pref回到40,如此往复陷入无限循环,最终导致编译器崩溃。
修复后的
add_before方法 def add_before(self,data,x): if self.head is None: print("LL is empty , so Node cannot be added! ") else: n = self.head while n is not None: if x==n.data: break n = n.nref if n is None: print("Node is not present in LL") else: new_node = Node(data) # 修正指针赋值顺序 new_node.nref = n new_node.pref = n.pref if n.pref is not None: n.pref.nref = new_node else: self.head = new_node n.pref = new_node
内容的提问来源于stack exchange,提问作者Kavish Paraswar
相关产品推荐
相关产品推荐

