82. 删除排序链表中的重复元素 II(Medium)
题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
样例
Input: 1->2->3->3->4->4->5
Output: 1->2->5
解题思路
-
伪节点:原因是头结点也可能会被删除
-
双结点:用于节点删除操作
-
通过
pre.next
来判断是否存在重复结点:- pre.next == cur :证明 cur 没有移动,即没有重复值,pre 移动到 cur
- pre.next != cur :证明 cur 移动了, 即存在重复值,pre 只删除重复值,不移动
代码
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
dummpHead = ListNode(None) # 头结点也可能会被删除,故使用 伪节点
dummpHead.next = head
pre, cur = dummpHead, head # 双指针: 复制节点的删除
while cur:
# 检查是否存在重复节点
while cur.next and cur.next.val == cur.val:
cur = cur.next
if pre.next == cur: # 不存在重复节点,pre 前移
pre = cur
else:# 存在重复节点,pre 删除重复值
pre.next = cur.next
cur = cur.next # cur 前移
return dummpHead.next