力扣刷题:删除排序链表的重复元素Ⅱ

题目:

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

示例 1:

输入:head = [1,2,3,3,4,4,5]

输出:[1,2,5]

示例2:

输入:head = [1,1,1,2,3]

输出:[2,3]

解析:

方法:双指针 + 虚拟头节点

  1. 使用虚拟头节点简化边界情况处理(特别是头节点可能被删除的情况)

  2. 用两个指针:

  • r:指向已确认不重复的最后一个节点

  • q:探索当前节点后面是否有重复值

  1. 通过判断 q 是否移动来确定当前节点是否重复

具体代码:

javascript 复制代码
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
    //设置虚拟头结点
    let pre = new ListNode(0,head);
    //设置指针指向虚拟头结点
    let r = pre;
    while(r.next){
        let q = r.next
        while(q.next && q.val === q.next.val){
            q = q.next
        }
        if(q === r.next) {
            r = r.next
        }else {
            r.next = q.next
        }
    }
    return pre.next
};
相关推荐
s1hiyu21 小时前
实时控制系统验证
开发语言·c++·算法
daad77721 小时前
V4L2_mipi-csi
算法
2301_7657031421 小时前
C++代码复杂度控制
开发语言·c++·算法
m0_7088309621 小时前
C++中的享元模式实战
开发语言·c++·算法
naruto_lnq21 小时前
分布式计算C++库
开发语言·c++·算法
m0_706653231 天前
模板编译期排序算法
开发语言·c++·算法
历程里程碑1 天前
Linxu14 进程一
linux·c语言·开发语言·数据结构·c++·笔记·算法
木井巳1 天前
【递归算法】验证二叉搜索树
java·算法·leetcode·深度优先·剪枝
m0_561359671 天前
嵌入式C++加密库
开发语言·c++·算法
近津薪荼1 天前
优选算法——双指针专题7(单调性)
c++·学习·算法