# [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;
}