思路
实现
/*
说下大概思路:
与链表的其他题目类似,为了防止删除头结点的极端情况发生,先创建空结点dummy,使dummy指向传入的head结点。
然后创建cur的指针,指向链表的头部(即dummy)。
接着对cur指针迭代,因为要对比cur(cur最初始的定义指向空结点)指针的下一个结点与下下一个结点的值是否相等,为了防止产生空指针异常,故退出迭代的条件为:cur.next != null && cur.next.next != null。
在迭代过程中,如果cur.next.val == cur.next.next.val说明此时有重复元素,此时创建一个临时指针temp,指向cur的下一个节点,即temp指向的第一个重复元素所在的位置。通过while循环去重,去重后,temp指向的是重复元素中的最后一个位置。最后cur.next = temp.next就实现了消除重复元素。
当然,如果为发现重复元素,则直接向后迭代即可。
> https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/solution/java-ya-jie-dian-fei-di-gui-rong-yi-li-jie-yong-sh/
*/
func deleteDuplicates(head *ListNode) *ListNode {
if head == nil {
return head
}
// 添加dummy节点,统一head情况的处理. 因为没有dummy节点的话, 那么删除头节点时需要额外处理。
dummy := &ListNode{0, head}
cur := dummy
for cur.Next != nil && cur.Next.Next != nil {
// 判断cur的下一个结点与下下一个结点的值是否相等
if cur.Next.Val == cur.Next.Next.Val {
// 定位最后一个重复元素
tmp := cur.Next // tmp初始化指向第一个重复元素
for tmp != nil && tmp.Next != nil && tmp.Val == tmp.Next.Val {
tmp = tmp.Next
} // 循环退出时,tmp指向最后一个重复元素
cur.Next = tmp.Next // 去掉tmp指向的最后一个重复元素
} else {
cur = cur.Next
}
}
return dummy.Next
}
https://gitee.com/sicnu-yudidi/interview/blob/master/剑指offer-v2/链表/82. Remove Duplicates from Sorted List II/main.go