Java 实现快慢指针法返回链表的中间结点

news2024/11/25 20:43:50

一、思路

这里分为链表结点个数是 奇数偶数 两种情况。

如果是奇数,中间结点只有一个,返回即可;如果是偶数,中间结点则有两个,这里要求返回第二个。


上述图片展示的就是奇数的情况,此时中间结点就是 34。


以上展示的就是偶数的情况,此时看到中间结点是 23 和 34 两个,但是我们返回的是第二个,
因此此时实际返回的是 34 这个结点。


定义一个 slow 和 fast 变量来表示快慢指针,slow 每次走一步,代表慢指针;fast 每次走两步,代表快指针。


二、步骤

1、定义 slow 和 fast ,然后将它们都指向头结点,从头结点开始向后移动。


接下来就是让 slow 和 fast 按照各自的步数移动。


2、写一个循环来找中间的结点。

我们怎么来找中间结点呢?

因为 fast 每次要比 slow 多走一步,因此 fast 一定会比 slow 走得多,当然这里是分为奇数和偶数两种情况的。

如果结点个数是奇数,当 fast 的下一个结点 为 null 的时候,此时当前 slow 指向的位置就是中间结点,返回中间结点即返回 slow。


根据上述图片可以看到,当 fast 的下一个结点为空的时候 slow 确实是指向了中间结点。


如果结点个数是偶数,当 fast 指向的结点 为 null 的时候,此时循环就遍历结束了,并且当前 slow 指向的位置就是第二个中间结点,返回中间结点即返回 slow。

可以看到当前 fast 指向空的时候,此时 slow 指向的就是第二个中间结点。


三、代码

首先是要创建两个指针来指向链表的头结点。

ListNode fast = this.head;
ListNode slow = this.head;


我们知道分为奇数和偶数两种情况后,而 fast == null 与 fast.next == null 分别代表上述两种情况。

循环的判断条件就是 fast == null && fast.next == null ,也就是说,当不满足上述条件后,slow 此时就指向了中间结点,此时一定跳出循环,然后返回 slow 结点即可。

while (fast != null && fast.next != null) {
   
}
   return slow;//此时的slow就是中间的结点


因为 slow 是慢指针,一次只会走一步,要让 slow 指向它的下一个结点就使用以下代码。

 slow = slow.next;//走一个

代码是让 slow 指向它的下一个结点。


fast 是快指针,一次走两步使用以下代码。

 fast = fast.next.next;//走两个

代码是让 fast 指向它的下一个结点的下一个结点。


完整代码展示

//2.返回中间的结点
public ListNode middleNode() {
    //1.定义一个fast和slow
    ListNode fast = this.head;
    ListNode slow = this.head;

    //2.fast每次走两步,slow每次走一步
    //判断奇数和偶数个结点
    while (fast != null && fast.next != null) {
        //如果是偶数就返回第二个中间结点
        //如果是奇数就返回中间的结点
        fast = fast.next.next;//走两个
        slow = slow.next;//走一个
    }
    return slow;//此时的slow就是中间的结点
} 



可以看到当前的代码通过了 牛客 上的测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

找不到“$libdir/postgis-X.X“问题解决方案

背景: 数据库从postgresql-11.9 升级到11.20版本,11.20版本采用了docker镜像 postgis/postgis:11-3.3 (截止20230703实际对应的版本为pg11.20postgis3.3) 升级版本,使用了原来的data,主要版本不变,次要版本升级&#…

文档管理系统是业迈向数字化办公的新时代

随着信息技术的不断发展,企业数字化办公已成为越来越多企业的选择。在数字化办公中,文档管理系统是一个非常重要的组成部分,可以帮助企业打破时空限制,提高工作效率和质量,推动企业向数字化办公的新时代迈进。 什么是…

力扣 39. 组合总和

题目来源:https://leetcode.cn/problems/combination-sum/description/ C题解: 递归法。递归前对数组进行有序排序,可方便后续剪枝操作。 递归函数参数:定义两个全局变量,二维数组result存放结果集,数组pa…

当使用POI打开Excel文件遇到out of memory时该如何处理?

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 当我们开发处理Excel文件时,Apache POI 是许多人首选的工具。但是&#xff…

ssh Permission denied, please try again

Permission denied, please try again 修改 vi /etc/sshd_config 最后重启配置或者重启板子,重新ssh连接

优化springboot

介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 1. 方便微服务部署。 2. 方便项目启动,不需要下载Tomcat或者Jetty 针对目前的容器优化,目前来…

Dual In-Line Package(双列直插式封装)

DIP封装示意图 DIP的详细介绍: 1.封装形式:DIP是一种插件式封装,它由一个狭长的塑料或陶瓷封装体组成,具有在两侧排列的引脚。引脚通常是分布均匀的,并以一定的间隔排列,以便与插座或印刷电路板上的插孔对…

vue 连载软件大陆 vue之新手村,vue创建运行指导(如:vue脚手架,创建启动项目,配置等)

第一章 ’vue功法启动‘ 宇宙之间,开天辟地,从无到有,有一颗蔚蓝色的星球,名为软件大陆,如今大陆上有着众多老牌家族势力的诞生,如:c家族、c家族、java家族、.net家族、等, 而我们今天要说的是…

Vue + electron 构建桌面应用程序

文章目录 需求分析解决 需求 使用Vue.js构建桌面应用程序 分析 选择一个Vue.js框架:选择一个适合你的Vue.js框架。推荐使用Electron,因为它是最流行的桌面应用程序框架之一,而且与Vue.js非常兼容。还有其他框架,如 Proton Native…

【C语言趣味教程】第一章:你好, 世界! 「热门 C 语言专栏《维生素C语言》2023 全新重制」

🔗 《C语言趣味教程》👈 猛戳订阅!!! ​—— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#x…

SQL注入第三章节数据类型与提交方式

SQL注入第三章节数据类型与提交方式 3.1 SQL注入之数据类型 (1)数字型注入点 许多网页链接有类似的结构 http://xxx.com/users.php?id1。基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字&#xff0c…

02、Nginx目录结构与基本运行原理

一、目录: Nginx一般安装在/usr/local/nginx目录下(安装时–prefix可指定安装目录) conf #配置文件|-nginx.conf #主配置文件|-其他配置文件 #可通过那个include关键字,引入到了nginx.…

Redis(主从复制、哨兵模式、集群)概述及部署

Redis(主从复制、哨兵模式、集群)概述及部署 一、Redis主从复制1、Redis主从复制的概念2、Redis主从复制的作用3、Redis主从复制的流程4、Redis主从复制的搭建 二、Redis 哨兵模式1、哨兵模式的原理2、哨兵模式的作用3、哨兵模式的结构4、哨兵模式的搭建…

【Redisson】Redisson--分布式远程服务(Remote Service)

Redisson系列文章: 【Redisson】Redisson–基础入门【Redisson】Redisson–布隆(Bloom Filter)过滤器【Redisson】Redisson–分布式锁的使用(推荐使用)【分布式锁】Redisson分布式锁底层原理【Redisson】Redisson–限流器 文章目录 一、Redi…

java--类变量与实例变量--实验设计--村庄种树

目录 设计要求 设计流程图 程序代码 类Village代码 类MainClass代码 可以直接运行的代码 运行结果 类变量与实例变量的区别和类方法与实例方法的区别 idea的详细使用方法 设计要求 编写程序模拟两个村庄共同拥有一片森林;编写一个Village类,该类…

WebDAV之派盘本地个人云+RaiDrive

RaiDrive是一款Windows平台下的网络驱动器软件,可以将云存储、FTP、WebDAV等网络存储设备映射为本地磁盘,方便用户在本地访问、管理和备份云端数据。它支持的存储设备包括Google Drive、Microsoft OneDrive、DropBox、以及FTP、SFTP等等。使用RaiDrive,用户可以在本地用文件…

Java中规模软件开发实训——掌握财务自由的关键!解锁智能家庭记账系统的神奇力量!(家庭记账软件)

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(html css js) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:财务自由&am…

【LeetCode】HOT 100(20)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

LeetCode·每日一题·2679. 矩阵中的和·排序

作者:小迅 链接:https://leetcode.cn/problems/sum-in-a-matrix/solutions/2330084/pai-xu-zhu-shi-chao-ji-xiang-xi-by-xun-g-a3gw/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,…

图书推荐管理系统Python,基于Django和协同过滤算法等实现

一、介绍 图书推荐系统 / 图书管理系统,以Python作为开发语言,基于Django实现,使用协同过滤算法实现对登录用户的图书推荐。 二、效果展示 三、演示视频 视频代码:https://www.yuque.com/ziwu/yygu3z/gq555ph49m9fvrze 四、Dj…