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

链表中head=something与head.next=something的区别是什么?

链表中 head = something; 和 head.next = something; 的核心区别

这问题问得太关键了,刚好可以结合你给的去重代码来把这个点讲透!

先从链表的本质说起:head 其实是一个指向链表第一个节点的引用,每个 Node 实例有自己的 data 和 next 指针(指向链表的下一个节点)。这两个赋值操作的本质完全不同:

1. head = something;:改变引用的指向

这个操作是直接修改 head 这个变量本身的指向——相当于让 head 放弃原来指向的节点,转而指向 something(可能是另一个 Node 实例,也可能是 null)。

举个例子:如果原来 head 指向节点A(链表是 A->B->C),执行 head = B 之后,head 现在指向B,原来的节点A如果没有其他引用的话,就会和后面的链表彻底断开,变成孤立节点(会被垃圾回收),新的链表变成 B->C。

2. head.next = something;:修改节点的next指针

这个操作完全不会改变 head 的指向——head 依然指向原来的节点,只是把该节点的next指针改成指向 something。本质是修改链表的结构(比如删除、插入节点),而不是移动链表的头引用。

结合你给的 RemoveDuplicates 代码来看:

Node RemoveDuplicates(Node head) { 
    Node temp=head; 
    while(temp.next!=null){ 
        if(temp.data == temp.next.data){ 
            // 这里修改的是temp指向节点的next指针,跳过重复节点
            temp.next=temp.next.next; 
        } else { 
            System.out.println(temp.data); 
            // 这里才是改变temp的指向,移动到下一个节点
            temp=temp.next; 
        } 
    } 
    return head; 
}

当发现当前节点和下一个节点数据重复时,temp.next=temp.next.next; 把当前节点的next直接指向重复节点的下一个,这样重复节点就被从链表中移除了——而 temp 本身还停留在当前节点,因为我们只需要修改它的next指针,不需要移动遍历的位置(毕竟还要检查新的next节点是否和当前节点重复)。

如果这里写错成 temp=temp.next.next;,那只是让 temp 跳过了重复节点,但原来的temp节点的next还是指向重复节点,重复节点根本没被移除,链表结构完全没变,这就彻底错了!

一句话总结

  • head = X:移动链表的头引用,让它指向新的节点/空
  • head.next = X:保持头引用不变,修改头节点的后继关系,调整链表内部结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:39:17