# [82] 删除排序链表中的重复元素 II

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

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

示例 1:

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

输出:[1,2,5]

示例 2:

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

输出:[2,3]

提示:

题目数据保证链表已经按升序排列

注意点在于,对于重复元素,我们要一个不留的全部删除,因此必须保留一个每个节点的前一个节点的指针 prev,方便通过 prev.next 删除所有元素节点。

function deleteDuplicates(head: ListNode | null): ListNode | null {
  // 如果链表长度小于等于 1,则不可能有重复元素
  if (!head || !head.next) return head;

  let dummy = new ListNode();
  dummy.next = head;

  let prev = dummy;
  let curr = head;
  while (curr && curr.next) {
    if (curr.val === curr.next.val) {
      const sameValue = curr.val;
      // 如果有重复元素,则找出所有相同 val 的节点
      while (curr && curr.val === sameValue) {
        curr = curr.next;
      }
      // 删除之间的所有节点
      prev.next = curr;
    } else {
      // 否则,继续往下遍历
      prev = curr;
      curr = curr.next;
    }
  }
  return dummy.next;
}