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

LeetCode有序链表去重:head指针及返回逻辑的疑惑

有序链表去重问题的指针疑惑解答

问题背景

刚完成数据结构与算法在线课程,开始刷LeetCode的有序链表去重问题,题目输入为有序链表的head,要求移除所有重复节点并返回新链表。附上示例解法代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head is None:
            return head
        pt=head
        prev=pt
        pt=pt.next
        while pt:
            if pt.val==prev.val:
                # 如果两个节点值相同,prev.next跳过当前pt,直接指向pt的下一个节点
                prev.next=pt.next
                pt=pt.next
            else:
                prev=pt
                pt=pt.next
        return head  

疑惑解答

  • 关于head的含义与直接return head的现象
    head就是指向链表首节点的指针,它本身不会自动遍历。你写return head的错误解法输出和输入一致,是因为你完全没修改链表的结构——链表的节点是靠next指针串联的,你没改动任何节点的next指向,所以整个链表和输入完全一样。而LeetCode判题时会自动从head开始遍历整个链表来输出结果,这是判题逻辑做的事,不是head自己会遍历。

  • 为什么修改prev指针后return head就能得到去重链表
    链表是引用类型,head、prev、pt这些指针都是指向链表节点的引用。你操作prev时,修改的是prev.next的指向:比如当发现pt和prev值重复时,把prev.next改成pt.next,这直接修改了原链表的节点连接关系——原本prev指向pt,现在跳过pt直接指向pt的下一个节点,pt这个重复节点就被从链表的链路上剔除了。
    而head始终指向原链表的首节点(这道题里有序链表的首节点不可能被删除,因为没有比它更早的重复节点),所以从head开始遍历,就能得到修改后的去重链表——整个过程都是在原链表基础上修改节点间的连接,没有新建链表,最后返回的head还是指向首节点,但后面的节点连接已经被prev的操作修正好了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:25:25