剑指offer18.删除链表中重复节点

Posted yudidi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer18.删除链表中重复节点相关的知识,希望对你有一定的参考价值。

思路

实现

/*
说下大概思路:
与链表的其他题目类似,为了防止删除头结点的极端情况发生,先创建空结点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

以上是关于剑指offer18.删除链表中重复节点的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-18-2. 删除链表中重复的结点

剑指offer——面试题18.1:删除链表中重复的节点

刷题记录-剑指offer18.2:删除链表中重复的节点

刷题记录-剑指offer18.2:删除链表中重复的节点

剑指offer18.删除链表中重复节点

剑指Offer:删除链表的节点18