链表中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

