[路飞]- leetcode82. 83 合集 删除重复俩表

286 阅读2分钟

我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

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

去重链表.gif

思路:

关于链表删除的问题,头节点也要考虑删除。所以这里需要借助虚拟头节点来指向头部,方便处理。

我们需要一个指针在虚拟头节点的位置cur,然后判断头节点的下一个和下下个是否相等,如果相等,将虚拟头节点curnext指向cur.next.next, 否则 cur进行下一个比较 cur = cur.next

// 代码示例
var deleteDuplicates = function(head) {
    if(!head)return head
    
    // 虚拟头
    let dummy = {next: head}
    let cur = dummy // 用于遍历的指针
    while(cur.next && cur.next.next){
        if(cur.next.val == cur.next.next.val){
            cur.next = cur.next.next
        }else{
            cur = cur.next
        }
    }
    return dummy.next
}

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

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

思路

这道题呢和上一道题是不一样的。这道题是需要将重复的元素全部删除。但大致的步骤是一样的,只是我们在比较时cur.next需要指向最后一个重复节点的后面一个节点。

去重链表2.gif

// 代码示例
var deleteDuplicates = function(head) {
    if(!head)return head
    
    // 同样这里需要一个虚拟头节点
    let dummy = {next: head}
    let cur = dummy // 用于遍历的指针
    while(cur.next && cur.next.next){
        if(cur.next.val == cur.next.next.val){
            // 不同点 这里需要一直循环
            let x = cur.next.val // 记录一下cur.next的值
            while(cur.next && x === cur.next.val){ // 此时cur.next.val是移动后的新值
                cur.next = cur.next.next //如果相等 cur.next指向一直向后移动
            }
        }else{
            cur = cur.next
        }
    }
    return dummy.next
}

结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~