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

将链表头节点指向第二个节点后,首个节点会被垃圾回收吗?

链表垃圾回收问题

代码示例

public class ListNode {
     public int val;
     public ListNode next;
     public ListNode(int val=0, ListNode next=null) {
         this.val = val;
         this.next = next;
     }
     public static void Main(){
         ListNode head = new ListNode(5);
         ListNode curr = head;
         curr.next = new ListNode(6);
         curr = curr.next;
         curr.next = new ListNode(7);
         curr = curr.next;
         curr.next = new ListNode(8);
         curr = null;
     }
}

问题描述

通过上述代码创建了一个链表,初始时head指向值为5的节点(即你说的节点1)。将head指向值为6的节点(节点2)后,节点1会被垃圾回收器回收吗? 注意此时节点1不再被任何标识符引用,但它的next指针仍指向节点2(非空对象)。

补充疑问:我认为GC会回收所有未被使用的空闲对象,但此处节点1仍与正在使用的链表相连,对此存在疑问。

解答

答案是:节点1会被垃圾回收器回收。

垃圾回收的核心判断依据是对象是否可达——也就是是否存在从GC根(比如当前栈中的变量、静态变量等)到该对象的引用路径。

当你把head改为指向节点2后,节点1不再被任何GC根引用:

  • 原本的head现在指向节点2,没有变量再指向节点1;
  • 节点1的next指向节点2,但这是反向引用,GC不会因为节点1引用了可达对象就认为节点1本身可达。只有当存在从根到节点1的正向引用链时,节点1才会被标记为存活。

简单说:只要没有任何活跃的引用链能找到节点1,哪怕它还引用着其他可达对象,GC也会把它回收掉。


内容的提问来源于stack exchange,提问作者Yasir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:49:01