You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单链表中间引入循环后,不可访问节点的状态及归属疑问

单链表节点添加问题与节点状态解析

原链表结构

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:00:19