单链表中间引入循环后,不可访问节点的状态及归属疑问
单链表节点添加问题与节点状态解析
原链表结构
19-->85-->50-->20-->33-->9-->1-->7-->null
实现的任意位置添加节点方法
public void add_node_any(int value , int position) { ListNode node = new ListNode(value); if (position == 1) { node.next = head; head = node; } else { ListNode previous = head; int count = 1; while (count < position - 1) { previous = previous.next; count++; } previous.next = node; node.next = previous.next; } }
调用代码
single.add_node_any(2, 3);
问题与解答
你遇到的核心问题是代码中的两行错误导致循环,同时切断了原链表后续节点的引用。
节点状态说明
50及之后的节点已经不属于当前链表,它们是内存中不可达的垃圾对象,最终会被Java垃圾回收器回收。原因如下:
- 执行
previous.next = node时,原本指向50的85节点的next引用被替换为新节点2,直接切断了85与50的连接。 - 紧接着
node.next = previous.next,此时previous.next已经是新节点2,这就让新节点的next指向自身,形成了循环链表(19->85->2->2->...)。 - 此时50及后续节点没有任何从链表头(head)出发的可达引用链,完全和当前链表脱离了关系,不再属于这个链表的一部分。
所谓「仍属于链表只是不可访问」的说法是错误的,链表的定义是从表头出发,通过next引用能遍历到的所有节点的集合,断连的节点不在这个集合内,只是孤立的内存对象。
代码修正
要正确添加节点,需要先保存原本的previous.next(也就是50节点),再重新赋值引用:
// 替换错误的两行代码 ListNode temp = previous.next; // 先保存原链表中previous的下一个节点 previous.next = node; // 将previous的next指向新节点 node.next = temp; // 将新节点的next指向保存的原节点
内容的提问来源于stack exchange,提问作者NV basnayaka
相关产品推荐
相关产品推荐

