返回

理清思路,一览83题:删除链表中重复元素

闲谈

由 LeetCode 题号 83 题而来的「删除链表中重复元素」,是一个典型的链表题目。本篇文章,我们将从需求分析到代码实现,全方位解析这道题目,给你的解题之旅提供清晰的思路和详细的步骤。

需求分析:厘清题目要义

  1. 目标: 删除链表中所有重复的元素,使每个元素只出现一次。
  2. 输入: 一个按升序排列的链表的头节点 head。
  3. 输出: 删除重复元素后,同样按升序排列的结果链表。
  4. 约束:
    • 链表中节点数目在范围 [0, 300] 内。
    • -100 <= Node.val <= 100

解题思路:化繁为简,逐个击破

  1. 初始化: 设置一个哑结点 dummy 作为链表的头节点,方便后续操作。
  2. 双指针法: 使用两个指针 currprev 遍历链表。
    • curr 指向当前节点,初始指向 dummy
    • prev 指向 curr 的前一个节点,初始指向 null
  3. 重复比较:
    • currprev 指向的节点值相等时,说明存在重复元素。
    • 此时,将 prev 指向 curr 的下一个节点,跳过重复元素。
    • 如果 currprev 指向的节点值不相等,则将 currprev 都向前移动一位。
  4. 返回结果: 遍历完成后,dummy 的下一个节点就是删除重复元素后的结果链表的头节点。返回该节点即可。

代码实现:一步步攻克难关

def delete_duplicates(head):
    """
    删除链表中所有重复的元素,使每个元素只出现一次。

    Args:
        head: 链表的头节点。

    Returns:
        删除重复元素后的结果链表的头节点。
    """
    # 初始化哑结点
    dummy = ListNode(0)
    dummy.next = head

    # 双指针法遍历链表
    prev = dummy
    curr = head
    while curr:
        # 发现重复元素
        if curr.val == prev.val:
            # 跳过重复元素
            prev.next = curr.next
        # 没有重复元素
        else:
            # 将 prev 指向 curr
            prev = curr
        # 将 curr 指向下一个节点
        curr = curr.next

    # 返回结果链表的头节点
    return dummy.next

总结:触类旁通,温故而知新

LeetCode 题号 83 题「删除链表中重复元素」的解题之旅到此结束。从需求分析到代码实现,我们一步步理清了思路,攻克了难关。希望这篇文章能为你提供清晰的指引,让你在解决链表问题时游刃有余。

在编程的世界中,解决问题的方法多种多样。欢迎你继续探索其他解法,深入理解算法和数据结构的奥妙。这道题目的本质在于链表的遍历和元素比较,你可以尝试使用不同的遍历方式或比较策略,寻找更优的解法。

编程是一项充满乐趣和挑战的活动。希望你能在 LeetCode 的世界中不断学习,不断进步,成为一名优秀的程序员!