82. 删除排序链表中的重复元素 II
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
解:
- 这是一个排序链表,所以重复数字节点都连在一起
- 设置三个指针,快慢指针和前指针
- 遍历链表,快慢指针一起移动,当快指针下一个节点值和慢指针节点值一样的时候,慢指针不动,快指针就一直遍历到不相等的节点为止。
- 前指针的next指向快指针的下一个节点,快指针对应节点next置空,快慢指针一同指向下一个节点
- 在删除的过程中可能头节点是被删除掉的那个,所以构造一个节点指向头节点,最后返回这个节点的next。(删除节点很容易写,结果最后应该返回哪个节点让我想了半天。。。以前看链表类题目的题解不认真,这种构造节点的方法到现在才学会)
const deleteDuplicates = function(head) {
let quickNode = head
let slowNode = head
let res = new ListNode(0, head)
let preNode = res
while(quickNode && quickNode.next) {
if (quickNode.next.val === slowNode.val) {
while (quickNode.next && quickNode.next.val === slowNode.val) {
quickNode = quickNode.next
}
const temp = quickNode.next
quickNode.next = null
slowNode = quickNode = temp
preNode.next = temp
} else {
quickNode = quickNode.next
preNode = slowNode
slowNode = slowNode.next
}
}
return res.next
};