82. 删除排序链表中的重复元素 II
给定一个已排序的链表的头 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
- 题目数据保证链表已经按升序 排列
解题思路
Go代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteDuplicates(head *ListNode) *ListNode {
/*由于头结点也可能是重复的会被删除,所以建立虚拟结点dummy,使得操作统一
我们要把当前为某个值的前一结点preNode记录下来,和后面值比当前结点的值大的结点相连*/
if head == nil {
return nil
}
dummy := &ListNode{}
dummy.Next = head
preNode := dummy
//由于要用到p.next.val所以要判断p.next!=nil
for preNode.Next != nil{
cur := preNode.Next
n := 0 // 记录跨越了几个节点
//让cur指向第一个值不为preNode.Next.Val的结点
for cur != nil && preNode.Next.Val == cur.Val {
cur = cur.Next
n++
}
//如果curNode只跨越了一个结点,说明curNode跨越的该段不重复,
//那么就不用删除,移动preNode即可
if n == 1 {
preNode = preNode.Next
} else {//curNode跨越了多个结点,目前指向了第一个值不为preNode.next.val的结点
//故直接让preNode.next = curNode,相当于删除了curNode跨越的重复的那段
preNode.Next = cur
}
}
return dummy.Next
}

123

被折叠的 条评论
为什么被折叠?



