返回
理清思路,一览83题:删除链表中重复元素
闲谈
2023-10-30 20:52:36
由 LeetCode 题号 83 题而来的「删除链表中重复元素」,是一个典型的链表题目。本篇文章,我们将从需求分析到代码实现,全方位解析这道题目,给你的解题之旅提供清晰的思路和详细的步骤。
需求分析:厘清题目要义
- 目标: 删除链表中所有重复的元素,使每个元素只出现一次。
- 输入: 一个按升序排列的链表的头节点 head。
- 输出: 删除重复元素后,同样按升序排列的结果链表。
- 约束:
- 链表中节点数目在范围
[0, 300]
内。 -100 <= Node.val <= 100
。
- 链表中节点数目在范围
解题思路:化繁为简,逐个击破
- 初始化: 设置一个哑结点
dummy
作为链表的头节点,方便后续操作。 - 双指针法: 使用两个指针
curr
和prev
遍历链表。curr
指向当前节点,初始指向dummy
。prev
指向curr
的前一个节点,初始指向null
。
- 重复比较:
- 当
curr
和prev
指向的节点值相等时,说明存在重复元素。 - 此时,将
prev
指向curr
的下一个节点,跳过重复元素。 - 如果
curr
和prev
指向的节点值不相等,则将curr
和prev
都向前移动一位。
- 当
- 返回结果: 遍历完成后,
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 的世界中不断学习,不断进步,成为一名优秀的程序员!