如何从无序链表中移除重复项--Java版

2023-11-13

题目描述:
给定一个没有排序的链表,去掉其重复项,并保留原顺序,如链表1->3->1->5->5->7,去掉重复项变为1->3->5->7

方法一:顺序删除

思路: 通过双重循环直接在链表上执行删除操作。外层循环用一个指针从第一个节点开始遍历整个链表,然后内层循环用另一个指针遍历其余节点,将与外层循环遍历到的指针所指节点的数据域相同的节点删除(删除的是内层循环的节点)。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
    	//排除空表和单节点情况
        if (head == null || head.next == null) {
            return head;
        }
        ListNode outerCur = head;//用于外层循环,指向链表第一个节点
        ListNode innerCur = null;//内层循环用来遍历outerCur后面的节点
        //一旦涉及节点删除,那么就要找到该节点的前驱节点
        ListNode innerPre = null;//innerCur的前驱节点
        for (; outerCur != null; outerCur = outerCur.next) {
            for (innerCur = outerCur.next, innerPre = outerCur; innerCur != null; ) {
                //找到重复的节点并删除
                if (outerCur.val == innerCur.val) {
                    innerPre.next = innerCur.next;
                    innerCur = innerCur.next;
                } else {
                    innerPre = innerCur;
                    innerCur = innerCur.next;
                }
            }
        }
        return head;
    }
}

算法性能分析: 由于这种方法采用双重循环对链表进行遍历,因此,时间复杂度为O(N^2)。其中,N为链表的长度。在遍历链表的过程中,使用了常量个额外的指针变量来保存当前遍历的节点、前驱节点和被删除的节点,因此,空间复杂度为O(1)

方法二:递归法

思路: 对于节点cur,首先递归的删除以cur.next为首的子链表中重复的节点,接着从以cur.next为首的子链表中找出与cur有着相同的数据域的节点并删除。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        //对以head.next为首的子链表删除重复的节点
        head.next = deleteDuplicates(head.next);
        //找出以head.next为首的子链表中与head节点相同的节点并删除
        if(head.val == head.next.val){
            head = head.next;//此处直接切换头节点是最好的选择
        }   
        return head;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从无序链表中移除重复项--Java版 的相关文章

  • 理清js中数组与对象的区别-数据类型和Json格式

    Json的规格非常简单 只用一个页面几百个字就能说清楚 而且Douglas Crockford声称这个规格永远不必升级 因为该规定的都规定了 1 并列的数据之间用逗号 分隔 2 映射用冒号 表示 3 并列数据的集合 数组 用方括号 表示 4
  • js分支语句

    一 if条件判断语句 多条件判断
  • 谷歌插件开发:manifest.json 配置文件详解

    在当今的互联网时代 浏览器插件扮演着重要的角色 为用户提供了各种定制化的功能和增强体验 Google Chrome作为最受欢迎的浏览器之一 也提供了丰富的插件生态系统 而在Chrome插件的开发中 manifest json配置文件起着至关
  • 使用管理员权限打开cmd(命令提示符)的方法 (Windows10)

    目录 通过打开运行 Step1 win R Step2 输入cmd Step3 Ctrl Shift Enter 通过资源管理器 Step1 Ctrl Shift Esc Step2 鼠标左键点击 文件 Step3 Ctrl 鼠标左键点击
  • C语言利用数组输出26个小写字母

    带注释 include
  • Windows安装pnpm后提示“无法加载文件”错误

    环境 Windows 10 过程 今天在PowerShell命令行界面安装完pnpm包管理器后 执行pnpm v命令看是否有安装成功 报如下错误 pnpm 无法加载文件 C Users root AppData Roaming npm pn
  • discard long time none received connection. , jdbcUrl.......

    在druid中 日志输出报错discard long time none received connection jdbcUrl 的信息 但是对我们使用不会有影响 只是会影响性能 但作为强迫症的我 怎么会忍心看着这个ERROR呢 解决办法
  • java入门之 重写与重载

    一 重写 overriding 1 定义 子类重写父类的方法 通俗而言即为重新改写 将一个已有事物进行改变以适应新要求 2 要求 父类若有static private 则该方法不能重写 子类重写后的方法不能加static 方法名 方法参数
  • MathType公式编辑文本复制粘贴选项

    1 基于Web的Markdown格式 2 Typora
  • 88. 合并两个有序数组

    文章目录 题目描述 思路 代码 c 结果 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中
  • rk3288 6222b 模组调试 (rtl8822cs)--蓝牙

    任务 在rk3288 android7 1 上移植配置 rtl8822cs 的蓝牙模块 思路 拿到厂商的蓝牙驱动 参考里面的 驱动移植步骤 注 需要注意的是 最新的驱动是否和 Bluetooth app 中 jni 的代码匹配 文档中提到的
  • 数据结构---AVL树

    AVL树 AVL树的概念 AVL树节点的定义 AVL树的插入 源代码 AVL树的概念 二叉搜索树虽然可以缩短查找的效率 但是 如果数据有序或接近有序二叉搜索树将退化为单支树 查找元素相当于在顺序表中搜索元素 效率就会变低 因此 两位俄罗斯的
  • 基于NI_TestStand的智能驾驶自动化测试

    在汽车产业不断发展的今天 智能驾驶已经成为了汽车中必不可少的一部分 虽然目前真正的无人驾驶技术还未广泛应用于我们的日常生活中 但各式各样的驾驶辅助系统 如碰撞预警 自动刹车 自适应巡航等功能已经在为我们的驾驶员保驾护航 今天小编就带大家一起
  • deepin v23

    deepin v23虚拟机windows远程控制 仅限内网 解决deepin在虚拟机中鼠标卡顿延迟问题 需要安装x11vnc和xrdp 1 安装ssh 2 安装x11vnc 2 1 x11vnc配置开机自启 3 安装xrdp 3 1 打开终
  • ffmpeg rtsp 推流_RTSP网络摄像头 WEB端播放 并实时人脸检测

    彩色视频为摄像头的原始数据 灰色视频 灰度化 缩放 用来检测人脸 人脸图片为比对成功后回显 项目地址 https github com 15225845996 rtsp face 功能描述 1 浏览器实时播放摄像头信息 2 实时人脸检测 圈
  • Window主机加固

    win r 输入cmd进入命令提示符 用dir调出所有任务 cd 可以进入一个指定目录 cd 穿越或返回上一层 文件名有空格不连贯就是蓝标 箭头所指 没有空格的就是红色所指 它们的区别在于有空格是有双引号的 没有空格是没有的 切换盘的话 直
  • [数据分析与可视化] Python绘制数据地图2-GeoPandas地图可视化

    本文主要介绍GeoPandas结合matplotlib实现地图的基础可视化 GeoPandas是一个Python开源项目 旨在提供丰富而简单的地理空间数据处理接口 GeoPandas扩展了Pandas的数据类型 并使用matplotlib进
  • Excel单元格数值统计

    Excel单元格数值统计 Excel 工作表中对选定区域的数值进行统计的功能非常实用 仿照Excel的这个功能 请对给定表格中选中区域中的单元格进行求和统计 并输出统计结果 为简化计算 假设当前输入中每个单元格内容仅为数字或公式两种 如果为
  • 2021-08-02

    触发器 查询 删除 修改 一 什么是触发器 触发器 trigger 是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法 它是与表事件相关的特殊的存储过程 它的执行不是由程序调用 也不是手工启动 而是由事件来触发 二

随机推荐

  • 分割2021算法合集

    魔改nnU Net夺冠 2021 BraTS 脑肿瘤分割竞赛第一名解决方案 魔改nnU Net夺冠 2021 BraTS 脑肿瘤分割竞赛第一名解决方案 代码 https github com rixez Brats21 KAIST MRI
  • 电子信息工程考研:12大专业方向解读

    导读 模式识别与智能系统专业解读 通信与信息系统专业解读 电路与系统专业解读 信号与信息处理专业解读 电子与通信工程专业解读 电力电子与电力传动专业解读 光电信息工程专业解读 物理电子学专业解读 控制工程专业解读 集成电路工程专业解读 精密
  • mysql row()函数_详解mysql数据库binlog三种模式的区别(row,statement,mixed)

    概述 Mysql binlog日志有三种格式 分别为Statement MiXED 以及ROW 这三种格式之间有什么区别呢 下面先介绍下各自的优缺点 ROW 日志中会记录成每一行数据被修改的形式 然后在slave端再对相同的数据进行修改 只
  • 5.12 树和森林的遍历

    一 树的遍历 1 先根遍历 根左右 深度优先遍历 若树非空 先访问根节点 再依次对每棵子树进行先根遍历 树的先根遍历 void PreOrder TreeNode R if R NULL visit R 访问根结点 while R还有下一棵
  • 动态图分类:DySAT算法及其Python实现

    动态图分类 DySAT算法及其Python实现 动态图分类是计算机视觉领域的一个重要任务 其目标是对动态图像序列进行分类 DySAT算法是一种基于结构Self Attention和时域Self Attention的深度学习模型 用于解决动态
  • 在阿里云里面服务器怎么样可以更好的链接数据库

    环境 阿里云ubuntu服务器 阿里云RDS数据库 问题 如何在阿里云服务器的终端使用shell命令连接RDS云数据库 解决方法 1 阿里云服务器安装MySQL sudo apt get install mysql server 如果出现u
  • 非标准包 game.rgss3a 的打开方法

    写在前面 最近在玩 RPG 游戏 想拆一个 Game rgss3a 包 在网上找了很久的拆包方法 感觉写的比较凌乱 我来给大家整理一下吧 不过我本人的技术能力也很差 不确定说的是不是对的 就当是给大家提供几个方法 大家都自己试一下吧 先说
  • 近源渗透学习

    一 近源渗透 近源渗透测试是网络空间安全领域逐渐兴起的一种新的安全评估手段 它是一种集常规网络攻防 物理接近 社会工程学及无线电通信攻防等能力于一体的高规格网络安全评估行动 网络安全评估小组在签订渗透测试授权协议后 通过乔装 社工等方式实地
  • git 常用命令---修改Git默认编辑器为vim

    1 配置 git config global user email you example com 配置git用户名 git config global user name Your Name 配置git邮件 git config glob
  • C++类使用未定义类型 use undefined class

    a h file include
  • [论文笔记]AutoAssign 阅读笔记

    AutoAssign 阅读笔记 AutoAssign Differentiable Label Assignment for Dense Object Detection 摘要 1 引言 2 相关工作 固定标签分配 Fixed Label
  • Vue.js 生命周期函数

    系列文章目录 Vue js基础简答题 文章目录 系列文章目录 前言 一 创建阶段 1 beforeCreate 2 created 3 beforeMount 4 mounted 二 运行阶段 1 beforeUpdate 2 update
  • 字符设备驱动详解(主次设备号、注册/卸载字符设备驱动、创建设备节点、地址映射)

    1 主次设备号 1 主次设备号是内核用来索引设备的 每个主次设备号在内核中都是唯一的 每个注册的设备都有一个分配的主次设备号 2 同一个主设备号可以有多个从设备号 主设备是对应的驱动程序 次设备号对应设备文件所指的设备 一个Soc可能接同样
  • Odoo进销存(采购、销售、仓库)入门教程 - 上

    运行环境 Ubuntu14 04 Odoo8 0 作者 苏州 微尘 0 前言 Odoo OpenERP 作为一款优秀的开源ERP软件 开发历史已有10年之久 随着系统的发展成熟 已有越来越多的公司借助Odoo管理日常业务的方方面面 本文以一
  • undo表空间故障特殊恢复(一)

    author skate time 2010 09 09 undo表空间故障特殊恢复 一 这个测试的是instance recover 单实例里就是crash recovery 的恢复不需要故障undo里的数据 一般的情况instance
  • python修改字典内key对应的值的代码

    下面代码段是关于python修改字典内key对应的值的代码 希望对码农有用 d2 spam 2 ham 1 eggs 3 make a dictionary print d2 order is scrambled d2 ham grill
  • python爬虫网页编码问题——网页gbk编码

    爬虫的时候遇到一个网页的编码是有问题 添加了这句 没问题了 20210124 21 34 response encoding gbk
  • 基于Linux开发python项目

    在某些公司要求中 我们不会直接在Windows系统上做项目的开发 有时候会采用在linux系统上开发 而这分为两种情况 1 直接在本地搭建虚拟机 虚拟机上面装centos镜像 项目运行在本地虚拟机上 大部分原因都是项目的某些依赖包在Wind
  • 4 业务分析师

    在每个软件项目中 都有人在显式或隐式地扮演业务分析师 BA 的角色 业务分析师是能够在组织中促进变化的人 他们通过定义需求和向干系人推荐有价值的解决方案来促进这些变化 分析师获取和分析他人的观点 将收集到的信息转换为需求规范说明 并于其他干
  • 如何从无序链表中移除重复项--Java版

    题目描述 给定一个没有排序的链表 去掉其重复项 并保留原顺序 如链表1 gt 3 gt 1 gt 5 gt 5 gt 7 去掉重复项变为1 gt 3 gt 5 gt 7 方法一 顺序删除 思路 通过双重循环直接在链表上执行删除操作 外层循环