删除链表的中间节点

删除链表的中间节点

问题重述:

给你一个链表的头节点 head删除 链表的 中间节点 ,并返回修改后的链表的头节点 head

长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。

  • 对于 n = 12345 的情况,中间节点的下标分别是 01122

示例 1:

删除链表的中间节点
输入:head = [1,3,4,7,1,2,6]
输出:[1,3,4,1,2,6]
解释:
上图表示给出的链表。节点的下标分别标注在每个节点的下方。
由于 n = 7 ,值为 7 的节点 3 是中间节点,用红色标注。
返回结果为移除节点后的新链表。

示例 2:

删除链表的中间节点
输入:head = [1,2,3,4]
输出:[1,2,4]
解释:
上图表示给出的链表。
对于 n = 4 ,值为 3 的节点 2 是中间节点,用红色标注。

示例 3:

删除链表的中间节点
输入:head = [2,1]
输出:[2]
解释:
上图表示给出的链表。
对于 n = 2 ,值为 1 的节点 1 是中间节点,用红色标注。
值为 2 的节点 0 是移除节点 1 后剩下的唯一一个节点。

问题分析:

这道题让我们删除链表的中间节点,我们很快可以联想到使用快慢指针,快慢指针在对于删除链表中的某个结点的效果非常好,删除中间节点,我们可以使得慢指针每次移动1,快指针每次移动2,当快指针移动到末尾的时候,此时的慢指针指向的就是我们要删除的结点( 为了便于删除结点,我们可以使用dummy结点来简便操作

解法:

快慢指针

解题:

代码:
public ListNode deleteMiddle(ListNode head) {
        if(head == null || head.next == null) {
            // 当链表为空或者链表长度为1,没有中间节点,直接返回head
            return null;
        }else if(head.next.next == null) {
            // 当链表的长度大于1,等于2的时候,删除头节点
            head.next = null;
            return head;
        }
        // 当链表的长度大于2的时候,使用快慢指针删除结点(快指针速度为2,慢指针速度为1,即可实现找到中间节点)
        ListNode fast = head;
        ListNode slow = head;
        ListNode pri = new ListNode(-1);
        pri.next = head;
        while(fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            pri = pri.next;
        }
        if(fast.next == null){
            pri.next = pri.next.next;
        }else if(fast.next.next == null){
            slow.next = slow.next.next;
        }
        return head;
    }
代码解析:

当链表长度为空或者为1的时候,没有中间节点,直接返回null(只有一个节点的时候此时的结点就是中间结点),当长度为2的时候,删除后面的结点,直接将head.next指向空然后返回head即可。

当链表长度大于2的时候,此时我们就需要使用快慢指针来删除节点,为了便于删除,我们添加了pri结点用于记录要删除的结点的上一个结点( 其实我们可以使用dummy结点来直接简化操作,此时只需要创建一个连接到head的结点dummy,然后使得slow指针指向dummy即可),我们慢指针每走一步,快指针就要走两步,当快指针不能继续往后走的时候,此时的pri指向的就是要删除的节点的上一个结点。

总结:

快慢指针常用于删除链表中的某个结点

模板:

//创建一个dummy结点,该节点的下一个结点为head
Node dummy = new Node(0);
dummy.next = head;
Node fast = head;
Node slow = dummy;//为了得到所需节点的上一个结点
while(循环条件){
    //更新快慢指针
}
// 此时的slow指针对应的就是我们要找的结点,对该节点进行操作

Original: https://www.cnblogs.com/foldn/p/15918703.html
Author: foldn
Title: 删除链表的中间节点

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579766/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据库锁表及解锁

    一、查询PG_STAT_ACTIVITY的信息 SELECT * FROM pg_stat_activity where datname=’bms’ and wait_event_…

    Java 2023年6月5日
    069
  • Error response from daemon: oci runtime error: container with id exists

    Error response from daemon: oci runtime error: container with id exists 序 常见问题之Docker——Err…

    Java 2023年6月5日
    049
  • MSSQL中游标的语法结构

    | 0.21分钟 | 342.4字符 | 1、引言&背景 2、开箱即用的游标结构 3、声明与参考资料 | SCscHero | 2022/4/30 PM10:3 | 系列 …

    Java 2023年6月5日
    058
  • 如何用火焰图进行 Java 性能分析

    Linux下用火焰图进行性能分析(Ubuntu18 操作系统中演示) 软件的性能分析,往往需要查看 CPU 耗时, 了解瓶颈在哪里,而火焰图(flame graph) 是性能分析的…

    Java 2023年5月29日
    049
  • javaweb学生管理系统 第一次总结

    JavaWeb 学生管理系统 第一次总结 ; 具备的知识 java se 高级数据库jsselvetEl表达式jsp 项目 目录结构 [外链图片转存失败(img-dfQq8aOt-…

    Java 2023年6月8日
    085
  • Java基础学习总结

    写的这个博客是学习B站狂神说的Java教学视频的学习记录,记录了重点知识以及以前易混淆理解的知识点。本博客可能缺少部分基础知识点,适合像我一样学习Java过程中曾经半途而废的学生。…

    Java 2023年6月9日
    072
  • 浅谈Java中linkedlist和arraylist区别

    在Java中,关于集合框架有这样一个体系结构:其主要由两个接口派生而出:Collection和Map,然后再衍生出各自的一些实现类(比如Collection接口又被继承与Set和L…

    Java 2023年6月7日
    076
  • 阿里云 Docker 设置阿里云镜像加速

    1、登录阿里云 找到页面 容器镜像服务 2、找到…

    Java 2023年6月5日
    063
  • 排序算法-冒泡排序

    一、基本思想 冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没…

    Java 2023年6月5日
    0123
  • Mybatis多数据源(一) 不同的mapper文件对应不同的数据源

    如果一个系统存在多个业务数据库,那么就意味着在该系统中存在多个数据源,此时针对数据库的操作如何让其具体的落地到某个库中呢? 一个解决办法就是mybatis不同的mapper文件对应…

    Java 2023年5月30日
    078
  • EVE-NG 安装和使用过程中出现的问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    043
  • 根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第4版)

    发布第4版了,速度过来围观,这次版本更新如下: 1、新增查看数据库中所有表的对话框,在精确匹配文本框旁点击更多按钮或双击精确匹配文本框,即可弹出选择数据库表的对话框,这里将列出数据…

    Java 2023年6月9日
    063
  • README

    大家好,这里主要记录一些学习经历,代码过程相关东西。 萌新码农,入职一年,啥都不会,努力学习吧 Original: https://www.cnblogs.com/mrystar/…

    Java 2023年6月8日
    066
  • 【微服务】Nacos初体验

    SpringCloud – Nacos初体验 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝…

    Java 2023年6月16日
    088
  • 模拟tomcat服务器,sun公司,webapp开发者

    模拟tomcat服务器,sun公司,webapp开发者 首先我们思考一下一个动态web应用需要哪些角色参与,角色与角色之间又有多少协议? 1.有4种角色,分别是(浏览器开发团队[如…

    Java 2023年6月5日
    066
  • java-TestNg-selenium

    随笔分类 – java-TestNg-selenium https://www.cnblogs.com/mashuqi/category/1404222.html Or…

    Java 2023年5月29日
    065
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球