为何Java链表insertAfter方法中需创建tmpNext临时变量?
单向链表插入节点的逻辑解释
先看你贴的这段Java代码,这是单向链表中在当前节点后插入新节点的标准实现:
public void insertAfter(IntNode nodeLoc) { IntNode tmpNext; tmpNext = this.nextNodeRef; this.nextNodeRef = nodeLoc; nodeLoc.nextNodeRef = tmpNext; }
咱们用实际场景拆解你的疑问:假设当前节点是A,A原本的下一个节点是B,现在要把新节点C(也就是参数nodeLoc)插到A后面,最终要形成A→C→B的链表结构。
为什么不能直接写
this.nextNodeRef = nodeLoc;?
如果只写这一句,A的下一个节点直接变成C,但原来的B以及B后面的所有节点都会彻底丢失——因为没有任何引用指向它们了,链表直接从A→C就断了,原来的后续链全没了。为什么要用临时变量保存原节点引用?
当你执行this.nextNodeRef = nodeLoc;时,A原来的nextNodeRef(也就是指向B的引用)会被覆盖成指向C。如果不在覆盖前把B的引用存到tmpNext里,之后就再也找不到B了,所以必须提前存好这个关键引用。为什么要把临时变量存入新节点的
nextNodeRef?
这一步是为了把原来的后续链接回来。新节点C的下一个节点必须是原来的B,这样整个链表才能保持连续:A指向C,C指向B,原来的链表结构完全保留,只是在中间插入了C。如果不做这一步,C的下一个节点就是null,B还是会丢失。
内容的提问来源于stack exchange,提问作者Sheep_Walker
相关产品推荐
相关产品推荐

