删除链表元素详解版(Java)

2023-11-16

题目

Leetcode203题:移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
在这里插入图片描述

1,一般方法

先判断头节点,若不是,向后寻找val节点,找到待删除节点前驱,再删除val节点

 public ListNode removeElements(ListNode head, int val) {
        //判断头节点是否是空,且头节点正好是待删除的节点节点
        while(head != null && head.val == val){
            ListNode node = head;
            head = head.next;
            head.next = null;
        }
        if(head == null){
            return null;//链表为空
        }else{
            //从头寻找val节点
            ListNode prev = head;
            while(prev != null){
                if(prev.val == val){
                    //prev 是待删除节点前驱
                    //node就是待删除节点
                    ListNode node = prev.next;
                    prev.next = node.next;
                    node.next = null;
                }else{
                    prev = prev.next;
                }
            }
            return head;
        }

2,虚拟头节点法

单链表插入,删除都需要考虑头节点,当寻找前驱节点时由于头节点不存在前驱节点,需要另外考虑,此时引入虚拟头节点dummyHead,虚拟头节点不存储具体元素,不考虑头结点是否空,头节点一定存在,则所有节点都有前驱节点

 public ListNode removeElements(ListNode head, int val) {
        ListNode dummyHead = new ListNode(-1);//虚拟头节点
        //和链表链接
        dummyHead.next = head;
        ListNode prev = dummyHead;
        //虚拟头节点prev不存储具体元素,从虚拟头节点下一节点开始看
        while(prev.next != null){
            if(prev.next.val == val){
                //node就是待删除的节点
                ListNode node = prev.next;
                prev.next = node.next;
                node.next = null;//删除
            }else{
                //此时prev不是待删除节点的前驱,向后移动
                prev =prev.next;
            }
        }
        return dummyHead.next;
    }

3,递归法

使用递归的情况
(1)一个大问题分成若干小问题
(2)大问题和子问题规模相同,求解思路相同
(3)存在递归终止条件

 public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return null;
        }
        //删除头节点之后的元素
        head.next = removeElements(head.next,val);
        //判断头节点情况
        //if(head.val == val){
        //   return head.next;
        //}
        //   return head;
        return head.next == val ? head.next:head;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除链表元素详解版(Java) 的相关文章

随机推荐

  • 华为OD社招面试(技术二面完)--总结复盘

    2020年4月22日 华为OD社招面试复盘总结 一 华为OD简介 首先来解释一下什么是华为OD面试 OD一般是指的是华为的 外包 公司 比如像德科这种 网上其实有很多人都吐槽过这个招聘模式 因为招进去的人不直接是华为内部的人 挂在德科名下或
  • windows批处理:if else的踩坑点及排版优化

    参考 https www jianshu com p f0bde7d355a4 总结 见参考文章
  • python提取excel一列或多列数据另存为新表(1)

    系列文章目录 文章目录 系列文章目录 前言 一 python提取excel指定一列保存到新表 二 python提取excel指定两列保存到新表 总结 前言 一 python提取excel指定一列保存到新表 原数据举例如下 提取B列另存到新表
  • DFS深度优先搜索

    目录 一 DFS的概念 DFS的定义 DFS的搜索方式 DFS采用的数据结构 DFS的特点 二 DFS的实战应用 1 排列数字 2 n 皇后问题 一 DFS的概念 DFS的定义 DFS Depth First Search 深度优先搜索 是
  • 阈值分割法

    阈值分割法可以说是图像分割中的经典方法 它利用图像中要提取的目标与背景在灰度上的差异 通过设置阈值来把像素级分成若干类 从而实现目标与背景的分离 一般流程 通过判断图像中每一个像素点的特征属性是否满足阈值的要求 来确定图像中的该像素点是属于
  • chatGPT插件是什么,chatGPT插件作用介绍

    简介 openAI团队已经在 ChatGPT 中实现了对插件的初步支持 插件是专门为以安全为核心原则的语言模型设计的工具 可帮助 ChatGPT 访问最新信息 运行计算或使用第三方服务 目前体验与开发需要先加入等候名单 官网介绍链接 htt
  • java中如何导入同一个包下其他类文件中的方法,举个例子

    在 Java 中 可以使用 import 关键字导入同一个包下的其他类文件中的方法 例如 假设在同一个包 com example 下有两个类 ClassA 和 ClassB 那么可以在 ClassB 中导入 ClassA 中的方法 代码如下
  • LeetCode:二叉树的遍历方式(13道经典题目)

    LeetCode 二叉树的遍历方式 13道经典题目 本文带来与二叉树的遍历方法有关的经典题目 主要实现是C 144 二叉树的前序遍历 94 二叉树的中序遍历 145 二叉树的后序遍历 102 二叉树的层序遍历 107 二叉树的层序遍历 II
  • 盒模型BFC渲染机制

    目录 一 BFC基本慨念 二 BFC渲染规则 三 如何创建BFC元素 一 BFC基本慨念 一个块格式化上下文 block formatting context 是Web页面的可视化CSS渲染出的一部分 它是块级盒布局出现的区域 也是浮动层元
  • Python爬虫(JS逆向) 抓取POCO图片/Json数据处理/保存本地详细案例

    文章目录 目录 文章目录 前言 一 分析页面 二 逆向过程 2 1 分析参数 2 2 sign code值 2 3 扣代码 三 请求数据 处理Json数据以及把图片保存到本地 3 1 引入库 3 2 生成时间戳和参数 3 3 发起请求 四
  • SVN使用步骤

    1 基本操作 2 提交之间看一下变更内容 3 显示日志 是查看所有提交的记录 4 撤销和恢复操作 撤销本地修改 或者点击提交的时候 还原 把修改的撤销掉 第二种情况 内容已经提交上去了 点击提交日志 进行操作 只是撤销了本地 接着还需要继续
  • JS姓名和手机号脱敏处理

    export const mixins 身份证脱敏 methods 身份证号脱敏 setCertNo certNo if certNo certNo length gt 10 var certNo certNo trim let cert1
  • 单片机学习,设置一个密码锁

    用矩形键盘和LCD1602设置一个单片机 这是做完后所有所需要的文件 模板 具体模板以及功能参考我之前发的文章 51单片机常用的一些模块 模块化编程 延时函数模块 delay 独立按键模块 key 数码管模块 Nixie LCD1602模块
  • 【论文精读】IGEV-MVS:Iterative Geometry Encoding Volume for Stereo Matching

    今天读的是发表于CVPR2023的文章 作者全部来自于华中科技大学 文章链接 Iterative Geometry Encoding Volume for Stereo Matching 项目地址 GitHub 目录 Abstract 1
  • C语言中的条件操作符和前置++、后置++的区别

    一 条件操作符 条件运算符 conditional operator 有时候也称为三元运算符 ternary operator 或者trinary operator 因为它是唯一需要 3 个操作数的运算符 exp1 exp2 exp3 条件
  • BZOJ4868 [Shoi2017]期末考试

    YY一下的话感觉代价关于最晚出分时间是一个单峰函数 三分最晚的出分时间 然后贪心一下算代价就行 如果A gt B就只用B就行了 要不然的话出分时间小于当前限制的都可以随便往后调直到到达限制 那么先尽量用A 调不到限制以内的再用B即可 inc
  • 提升Python代码性能的六个技巧

    文章目录 前言 为什么要写本文 1 代码性能检测 1 1 使用 timeit 库 1 2 使用 memory profiler 库 1 3 使用 line profiler 库 2 使用内置函数和库 3 使用内插字符串 f string 4
  • 关于 DEBUG到ps.executeUpdate();这一步不执行的问题

    20191008 今天下午在公司debug的时候 发现两个表的一直走到SQL执行那一层的时候不往下执行了 原因是这两个表我再用PLSQL进行查询的时候用了select from xxx for update语句 然后没有commit 导致表
  • Yii2安装与基本应用记录

    前面陆续实验了laravel和CI平台 安装部署与应用 今天咱们再尝试一下yii平台 听说yii平台可以通过程序配置后 自动生成功能代码 很值得启动 不说废话 走起 首先是安装 yii的安装比较简单 不需要很复杂的其它附带的东西 只需要Co
  • 删除链表元素详解版(Java)

    目录 题目 1 一般方法 2 虚拟头节点法 3 递归法 题目 Leetcode203题 移除链表元素 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node val val 的节点 并返回 新的头节点 1 一般