删除排序链表中的重复元素 II|刷题打卡

115 阅读1分钟

每日算法 -- 链表

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

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

分析

  1. 这里是只要重复了,就将所有值都删除了,还有一种题目是,删除多余的值,即去重,需要注意
  2. 因为是完全删除,所以除了快慢指针,还得有一个前指针 prev,用来删除后连接新链表
  3. 由于有删除和没有删除的操作是不一样的处理,所以用一个变量指出是否是删除
  4. 为了防止链表头开始删除,所以需要开启 emptyNode,为了防止链表尾需要删除,所以遍历完了,还需要判断 isDelete 是否还未真,如果是,那么 prev 直接走到 null 即可
// 82. 删除排序链表中的重复元素 II
// https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

/**
 * @分析
 * 1. 这个链表已经排序了,所以相同的值都在一起了
 * 2. 只要快慢指针的值相同,则进行读写操作
 */
var deleteDuplicates = function (head) {
    if (!head || !head.next) return head
    let emptyNode = prev = new ListNode()
    emptyNode.next = head
    let slow = head
    let fast = head.next
    let isDelete = false // 标志是否开启删除模式
    while (fast) {
        if(fast.val === slow.val){
            // 这个时候只有fast 走,同时开启删除模式
            isDelete = true
        }else{
            if(isDelete){
                // 删除模式
                prev.next = fast
                slow = fast
                isDelete = false
            }else{
                prev = prev.next
                slow = slow.next
            }
        }
        fast = fast.next
        
    }
    // 遍历完了,但是可能最后的那一段是需要删除的
    if(isDelete){
        // 删除模式
        prev.next = fast
    }
    return emptyNode.next

};

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情