LeetCode有序链表去重代码疑问:操作temp为何返回head有效?
有序链表去重代码的底层原理解析
核心原因:Python引用类型的特性
链表节点是ListNode类的实例,属于引用类型。当执行temp = head时,并没有复制一份新的链表,而是让temp和head指向同一个内存地址里的链表头节点对象。也就是说,temp只是原链表头节点的一个"别名",对temp指向的节点的属性(比如next指针)做修改,本质就是直接修改原链表的节点。
代码逻辑拆解
我们一步步看代码的实际作用:
- 初始状态:
temp和head同时指向链表的第一个节点。 - 循环判断:只要
temp不为空且存在下一个节点,就继续检查。- 当发现
temp.next的节点值和当前temp的节点值重复时,执行temp.next = temp.next.next——这一步直接修改了temp指向的节点的next指针,跳过了重复的那个节点,相当于从原链表中移除了重复节点。 - 如果没有重复,就把
temp移动到下一个节点(temp = temp.next),继续检查后续节点。
- 当发现
- 整个过程中,
head始终指向原链表的头节点,从来没有改变过它的指向。但因为我们修改了头节点及其后续节点的next指针,原链表的结构已经被改变成去重后的样子。
举个实际例子
假设原链表是 1 -> 1 -> 2:
- 初始时
temp和head都指向第一个1节点。 - 检查发现
temp.next(第二个1)的值和当前temp的值相同,于是把temp.next改成temp.next.next(指向2),此时原链表变成1 -> 2。 - 跳过
temp的移动,下一次循环检查temp.next(2)和temp(1)的值不相等,temp移动到2节点。 - 循环结束,返回
head——head依然指向第一个1节点,而这个节点的next已经指向2,所以返回的就是去重后的链表。
为什么返回head可行?
因为链表的结构是靠节点之间的next指针串联起来的,只要头节点的引用还在,我们修改后续节点的next指针就能改变整个链表的结构。head自始至终都指向原链表的头节点,而头节点本身不会被删除(有序链表中头节点的重复只会出现在后面,不会被跳过),所以返回head就能得到修改后的去重链表。
内容的提问来源于stack exchange,提问作者Paul Ged
相关产品推荐
相关产品推荐

