[路飞]_程序员必刷力扣题: 82. 删除排序链表中的重复元素 II

445 阅读1分钟

「这是我参与12月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

82. 删除排序链表中的重复元素 II

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例 1:

image.png

输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]

示例 2:

image.png

输入: head = [1,1,1,2,3]
输出: [2,3]

提示:

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

一次遍历

思路

删除重复节点II中,只要是重复出现的元素就直接删除,不再保留任何一个,也就是说只保留唯一出现过一次的元素,当前节点curr等于newHead

  • 我们声明一个新的头结点newHead来衔接链表,方便处理边界

既然要重复,那么至少两个节点,所以当前节点的后两个节点,存在的话直接判断是否相等,

  • 相等则证明该节点属于重复节点,用变量repeatVal记录下节点的值,后不断更新curr.next为它的下一个值curr.next.next,直到curr.next的值不等于repeatVal,至此,重复元素已删除

  • 若不相等则证明curr.next是不重复仅仅出现过一次的元素,curr的指针向后移动,curr = curr.next

最后处理完毕后返回newHead.next即可

var deleteDuplicates = function (head) {
    if (!head) return head
    var newHead = new ListNode('head',head)
    var curr = newHead
    while(curr.next&&curr.next.next){
        if(curr.next.val===curr.next.next.val){
            var repeatVal = curr.next.val
            while(curr.next&&curr.next.val===repeatVal){
                curr.next = curr.next.next
            }
        }else{
            curr = curr.next
        }
    }
    return newHead.next
};