题目
题目描述
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
题解
要解决这个问题,我们可以使用一个哑节点(dummy node)和两个指针来遍历链表。哑节点的目的是简化某些边界条件的处理,比如当头节点需要被删除时。两个指针中,一个用于追踪当前正在检查的节点(prev
),另一个用于探索下一个节点是否重复(curr
)。
算法步骤:
- 创建哑节点:创建一个哑节点
dummy
指向链表的头节点。这样即使头节点是重复的也可以方便地进行删除操作。 - 初始化指针:设置
prev = dummy
,它将用来跟踪最后一个唯一节点的位置;curr = head
,它是当前正在检查的节点。 - 遍历链表:
- 如果
curr
和curr.next
都存在且它们的值相等,则继续前进curr
直到找到不同的值或到达链表末尾,并设置prev.next
指向这个不同的节点或者null
。 - 否则,如果
curr
的值不重复,则移动prev
到curr
位置,并将curr
向前移动一位。
- 如果
- 返回