算法学习记录(九十六)

168 阅读1分钟

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

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

image.png

解:

  1. 这是一个排序链表,所以重复数字节点都连在一起
  2. 设置三个指针,快慢指针和前指针
  3. 遍历链表,快慢指针一起移动,当快指针下一个节点值和慢指针节点值一样的时候,慢指针不动,快指针就一直遍历到不相等的节点为止。
  4. 前指针的next指向快指针的下一个节点,快指针对应节点next置空,快慢指针一同指向下一个节点
  5. 在删除的过程中可能头节点是被删除掉的那个,所以构造一个节点指向头节点,最后返回这个节点的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
};