JZ76 删除链表中重复的结点

2023-10-26

JZ76 删除链表中重复的结点

描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5

数据范围:链表长度满足 0 \le n \le 1000 \0≤n≤1000 ,链表中的值满足 1 \le val \le 1000 \1≤val≤1000

进阶:空间复杂度 O(n)*O*(n) ,时间复杂度 O(n) *O*(n)

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

示例1

输入:

{1,2,3,3,4,4,5}

返回值:

{1,2,5}

示例2

输入:

{1,1,1,8}

返回值:

{8}

迭代解法

思路

首先一个比较「直观且通用」的思路是,采用「边遍历边构造」的方式:

  1. 建一个「虚拟头节点」newHead 以减少边界判断,往后的答案链表会接在 newHead 后面;
  2. 使用 tmp 代表当前有效链表的结尾;
  3. cur指向pHead,cur 指针进行链表扫描。

对原链表进行遍历,只要原链表尚未到达结尾,我们就重复如下决策(保留/跳过逻辑):

  • 保留:cur 已经没有下一个节点,cur 可以被保留(插入到答案结尾指针 tmp 后面);cur 有一下个节点,但是值与 cur 不相同,cur 可以被保留;
  • 跳过:当发现 cur 与下一个节点值相同,需要对「连续相同一段」进行跳过。
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        //新建虚拟节点
        ListNode newHead = new ListNode(-1);
        ListNode tmp = newHead;
        ListNode cur = pHead;

        while(cur != null){
            if(cur.next != null && cur.val == cur.next.val){
                while(cur.next != null && cur.val == cur.next.val){
                    cur = cur.next;//不是最后一个节点重复
                }
                cur = cur.next;//最后一个节点重复,cur 往后后走,删除最后一个节点,此时cur == null 跳出循环
            }else{//没有重复节点,尾插
                tmp.next = cur;
                tmp = tmp.next;
                cur = cur.next;
            }
        }

        //防止当最后一个节点重复时,要记得将tmp.next置为空
        tmp.next = null;
        return newHead.next;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JZ76 删除链表中重复的结点 的相关文章

随机推荐

  • C++ 51.基于多态的职工管理系统(7)——删除职工功能

    功能描述 按照员工的编号进行删除职工操作1 删除职工函数声明 在workerManager h中添加成员函数 删除职工 void Del Emp 2 职工是否存在函数声明 按照职工编号判断职工是否存在 在workerManager h中添加
  • matlab数字和字符串转换

    一 数字转字符串 1 整数转字符串 int1 10 num2str int1 2 小数转字符串 dec1 1 23456 1 方法1 num2str dec1 6 保留6位有效数 2 方法2 num2str dec1 6f 保留小数点后6位
  • 解决axios发送数据到后端中文乱码问题

    解决axios发送数据到后端中文乱码问题 axios请求 const that this axios method post url http localhost 8080 2 SelectByIdServlet data this stu
  • Altium Designer22中修改元件库后,更新原理图的2种方法及这2种方法的区别。

    PCB设计过程中 经常会涉及到修改原理图库和PCB库的情况 那么修改了这些库之后 如何更新到已经绘制好的原理图中呢 更新过程中 如果想保留设置好的description footprint和value等属性 又该如何设置呢 方法一 在原理图
  • python3:retrying模块

    retrying是一个python的重试包 可以用来自动重试一些可能运行失败的程序段 retrying提供一个装饰器函数retry 被装饰的函数就在运行失败的情况下将重新执行 默认只要一直报错就会不断重试 Web sit https git
  • FPGA零基础学习之Vivado-RTC实时时钟系统设计

    FPGA零基础学习之Vivado RTC实时时钟系统设计 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业
  • mobx的使用

    mobx的使用 1 API mobx react Provider 包裹根组件 用于传递数据 observer 组件变为响应式 inject 接收mobx实例 用于类组件 MobXProviderContext mobx observabl
  • 远程控制---实验九:IPC远程植入木马

    目录 一 实验目的及要求 二 实验原理 IPC 空会话 IPC建立的过程 木马 三 实验环境 四 实验步骤及内容 五 实验总结 六 分析与思考 一 实验目的及要求 1 掌握利用 IPC 入侵目标计算机 windows XP 或 window
  • Java虚拟机内存参数设置

    Java虚拟机内存参数设置 前言 Java虚拟机 JVM 是一种抽象的计算机器 JVM是一个程序 对于编写在其中执行的程序来说 它看起来像一台机器 通过这种方式 Java程序被写入相同的接口和库集 针对特定操作系统的每个JVM实现都将Jav
  • 使用nginx反向代理docker安装的jenkins

    描述 使用nginx反向代理jenkins nginx反向代理 docker安装的jenkins 方法 一 nginx反向代理docker安装的jenkins 1 使用 vim etc nginx nginx conf进入nginx 的配置
  • Typescript类型注解和类型推断

    在TypeScript中有两个基本概念 类型注解和类型推断 这两个概念在我们使用TypeScript代码时会一直使用 一 类型注解 type annotation 如 let count number count 123 这种就是类型注解
  • QT运行出现The CDB process terminated解决办法(亲测有效)

    QT运行出现The CDB process terminated解决办法 运行程序时出现如图所示的问题 检查2件事 1 检查编译器和调试器 工具 选项 构建和运行 如果是电脑图标证明不是这里的问题 如果出现黄色的感叹号证明编译器和调试器没有
  • XNA简介

    href file C DOCUME 1 ADMINI 1 LOCALS 1 Temp msohtml1 02 clip filelist xml rel File List gt XNA简介 XNA简介 首先声明 XNA不是游戏引擎 它只
  • linux g++编译以及库多重依赖

    目录 一 编译命令 二 编译相关选项 三 静态库和动态库的编译命令 1 生成动态库和静态库 2 fPIC选项 3 如何解决运行时找不到链接库的问题 四 库多重依赖 1 动态库依赖动态库 2 动态库依赖静态库 3 静态库依赖静态库 一 编译命
  • 用了很多年的PC端离线版个人知识管理软件PKM2 Manager推荐给大家

    对于从事IT行业的童鞋来说 每人每天每月都会遇到大量的新知识与旧知识出现在眼前 从而就会出现知识容易遗忘 经验容易流失的情况 比如 曾经遇到过的某类问题 今天再次出现了 或曾经做过一次事情步骤 今天要再次重新做一遍等等 对这些众多的知识若没
  • 最难用的鼠标键、设置半天、反人类逻辑(罗技)

    目的 高效设置罗技鼠标键 提高复制粘贴效率 准备软件 Logitech G HUB Logitech 支持 下载 1 右上角 点击箭头 点击管理配置文件 2 左下角 点击加号 创建配置文件 办公 3 点击办公 4 右上角选择 办公 底部点击
  • YOLO算法概述与细节

    R CNN系列算法是two stage 两步走算法 yolo和ssd属于one stage算法 yolo v1 把图片分成若干个小区域 每个小区域负责检测是否有物体的中心点落在其中 每个小区域可预测多个box 但是只能检测一个物体 算法首先
  • 在C++中实现foreach循环,比for_each更简洁!

    原文 http blogread cn it article 2570 f sr python c java里面都有类似于foreach的结构 stl里面虽然有for each这个函数 但是感觉使用还是太繁琐了一些 所以就自己实现了一个 先
  • docker搭建lanproxy内网穿透服务

    docker搭建lanproxy内网穿透服务 一 服务端 1 1 安装docker 1 2 安装nginx 1 3 域名解析 1 4 安装lanproxy server 1 5 配置 nginx 反向代理 1 6 继续配置 lanproxy
  • JZ76 删除链表中重复的结点

    JZ76 删除链表中重复的结点 描述 在一个排序的链表中 存在重复的结点 请删除该链表中重复的结点 重复的结点不保留 返回链表头指针 例如 链表 1 gt 2 gt 3 gt 3 gt 4 gt 4 gt 5 处理后为 1 gt 2 gt