[路飞]_删除排序链表中的重复元素 II

227 阅读1分钟

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

题目

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。

示例 1:

image.png

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

力扣(LeetCode)链接:leetcode-cn.com/problems/re…

解题思路

  1. 这道题和第 83 题 删除排序链表中的重复元素 类似,区别是第 83 题保留重复节点中的一个,这道题要删除所有重复节点
  2. 链表为有序链表,相同节点是连续的
  3. 创建一个假头节点,next 指向 head,把头节点重复的情况变成一般情况
  4. 遍历链表,以下两种情况删除当前节点:
    • 当前节点的值等于下个节点的值
    • 当前节点的值等于上次删除节点的值
  5. 处理边界条件,head 为空时返回 head

示例 2:

82-1.gif

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

代码实现

var deleteDuplicates = function(head) {
  if (!head) return head

  let weakHead = new ListNode(null, head)
  let curr = weakHead
  let prev = weakHead
  let delNode = null

  while (curr) {
    //两种情况删除当前节点:
    //1.当前节点值等于下一个节点的值
    //2.当前节点值等于上个删除节点的值
    if ((curr.next && curr.val === curr.next.val) || 
    (delNode && curr.val === delNode.val)) {
      delNode = curr
      prev.next = curr.next
      curr = curr.next
    } else {
      prev = curr
      curr = curr.next
    }
  }

  return weakHead.next
}

如有错误欢迎指出,欢迎一起讨论!