链表insertAtIndex方法微小改动致不同输出,为何出现死循环?
为什么两段链表插入代码仅微小差异却导致死循环?
咱们先把两段代码的核心差异拎出来对比,一眼就能看到问题所在:
第一段(死循环代码)的关键行:
Node temp=n; // temp指向当前节点n本身 n.refrence=node; node.refrence=temp;
第二段(正常工作代码)的关键行:
Node temp=n.refrence; // temp指向n原本的下一个节点 n.refrence=node; node.refrence=temp;
接下来咱们拆解错误代码的执行逻辑,看看死循环是怎么来的:
假设我们要在链表的某个位置插入新节点node,此时变量n已经定位到了插入位置的前一个节点(比如链表是head → A → B → null,要在A后面插入,那n就是A)。
Node temp = n;:这一步让temp和n指向同一个节点(也就是A)。n.refrence = node;:把A的下一个节点改成了新节点node,现在链表变成head → A → node。node.refrence = temp;:把node的下一个节点指向temp(也就是A),这下链表直接形成了闭环:A → node → A → node → ...。
当后续遍历这个链表时,程序会一直在A和node之间无限循环,永远到不了原来的B节点,自然就出现了持续死循环的状态。
再看正确代码的逻辑:
同样以n是A为例:
Node temp = n.refrence;:这一步保存的是A原本的下一个节点(也就是B)。n.refrence = node;:让A的下一个节点变成新节点node,链表变成head → A → node。node.refrence = temp;:让node的下一个节点指向之前保存的B,最终链表变成head → A → node → B → null,完全是正常的链式结构,遍历的时候能正常走完所有节点,插入功能自然正常。
简单来说,错误代码是把新节点的后继指向了前一个节点本身,形成了循环链;而正确代码是把新节点的后继指向了原本的后续节点,维持了链表的线性结构——这一点点差异,直接决定了链表是正常工作还是陷入死循环。
内容的提问来源于stack exchange,提问作者Luv
相关产品推荐
相关产品推荐

