给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个结点

2023-11-05

一、思路

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

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


上述图片展示的就是奇数的情况,此时中间结点就是 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就是中间的结点
} 



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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个结点 的相关文章

随机推荐

  • 微软D365 入门文章汇总以及各项认证介绍(持续跟新.....)

    介绍 希望入门D365的同学们 需要具备的知识点 涉及C WebApi 前端知识 Power Platform等知识 以及Azure的知识点等 需要有了解 实施Microsoft Dynamics 365 CE 12章 实施Microsof
  • 多线程异常 和 事务(一)

    1 首先提出几个问题 1 1 子线程中的异常在主线程中是否可以catch 1 2 在spring中主线程有事务 那么子线程中有事务码 2 先看第一个问题 2 1 我们在main方法里面测试 代码如下 package com pingan t
  • 理解 glibc malloc:malloc() 与 free() 原理图解

    本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程 本文不过度关注细节 因此只是分别从arena层次 bin层次 chunk层次进行图解 而不涉及有关指针的具体操作 前言 Arena级分析 main arena中的内存申请 t
  • QuickLook搭配Everthing提高工作效率

    因为我的Everthing已经默认以管理员启动了 所以QuickLook也要以管理员权限启动才能查看Everthing中的文件 而QuickLook本身不能以管理员权限启动 所以需要在任务计划程序中设置 步骤 Ctrl R打开CMD 输入t
  • C++模板与泛型编程

    前言 泛型是独立于任何特定类型的编码 在C 中 我们经常使用的容器vector 该容器可以定义不同种类的vector 如vector list vector list或自定义类型等 函数模板 如果要编写一个函数来比较两个数的大小 返回其中最
  • sklearn逻辑回归参数设置_【机器学习笔记】:逻辑回归实战练习(二)

    作者 xiaoyu 微信公众号 Python数据科学 知乎 python数据分析师 前言 前几篇介绍了逻辑回归在机器学习中的重要性 5个原因告诉你 为什么在成为数据科学家之前 逻辑回归 是第一个需要学习的 以及逻辑回归的理论和公式推导 路远
  • Python报错ModuleNotFoundError: No module named ‘tensorflow.contrib‘ 的解决

    在GitHub上下载的image captioning的代码 运行时发现报错为ModuleNotFoundError No module named tensorflow contrib 在CSDN和GitHub上查询后发现是TensorF
  • VS Code插件推荐(一)

    1 Power Mode 炫酷的输入特效 2 Rainbow Theme 炫酷的字体颜色 让枯燥的代码多了一丝生机 3 koroFileHeader 趣味头文件注释 4 Chinese 汉化插件 5 Bracket Pair Coloriz
  • 第三章 利用TensorFlow Object Detection API实现摄像头实时物体检测

    通过第二章节 已经在Ubuntu16 04上实现了利用Google的TensorFlow Object Detection API对图片上物体的检测 这一部分在此基础上修改代码实现捕捉摄像头视频流 并对视频流实时物体检测 1 安装openc
  • Window XP驱动开发(十五) 驱动程序调用驱动程序(以文件句柄形式)

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 代码及EzDriverInstaller下载地址 http www rayfile com zh cn files 9376
  • 闲时整理3--Android调用指纹验证

    一 指纹判断工具类 package com kp client test import android app KeyguardManager import android content Context import android su
  • Talib技术因子详解(二)

    talib安装方式 pip install Ta lib Tushare数据获取请参考 金融量化分析基础环境搭建 数据获取代码请参考 Talib技术因子详解 一 11 SAR 阶段中点价格SAR指标又叫抛物线指标或停损转向操作点指标 调用方
  • EM算法及其推广学习笔记

    EM算法及其推广学习笔记 前言 在学习隐马尔科夫模型时 在学习算法中指出了Baum Welch算法 来实现对隐马尔科夫模型参数的求解 在该学习算法中用到了EM算法 因此我们先来看看EM算法到底是何方神圣 可自己在学习EM算法时 又遇到了一个
  • 使用KubeSphere3.3在Ubuntu20.04的Kubernetes1.24上部署Word Press

    使用KubeSphere3 3在Ubuntu20 04的Kubernetes1 24上部署Word Press 前言 之前已经部署了KubeSphere和K8S的基础环境 https lizhiyong blog csdn net arti
  • 基于SSM+JSP校园二手交易系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 数据分析回头看1——Pandas中数据处理总结

    0 前言 因为之前自己在学习pandas的过程中就简单做了下笔记 发现在用的时候还是会比较乏力 很多东西容易忘 所以我就决定结合之前笔记的内容 按照使用pandas的习惯 把知识点梳理一下 方便之后查找和记忆 1 说明pandas中的Ser
  • fiddler抓包工具的使用

    下载 Fiddler Web Debugging Proxy and Troubleshooting Solutions 安装 下载完成后 默认安装即可 使用 双击Fiddler exe进入界面 设置是否抓包 默认时开启的 表头介绍 序号
  • 在VirtualBox虚拟机中安装Linux 6.2 - 配置

    2 在VirtualBox虚拟机node1中安装Linux 6 2 配置 三 配置 一路Forward最后Finish完成 1欢迎界面 Forward gt 2接受红帽系统协议 Forward gt 3不用注册RHN Forward gt
  • 前端初学者必会技能

    1 HTML CSS HTML和CSS是Web开发最基础的部分 其中HTML构成了网页的 骨架 CSS为网页添加了颜色样式 是网页的 皮肤 网页上所看到的文本 图片以及花花绿绿的样式都是通过HTML和CSS实现的 因此学习Web开发首先要学
  • 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个结点

    一 思路 这里分为链表结点个数是 奇数 和 偶数 两种情况 如果是奇数 中间结点只有一个 返回即可 如果是偶数 中间结点则有两个 这里要求返回第二个 上述图片展示的就是奇数的情况 此时中间结点就是 34 以上展示的就是偶数的情况 此时看到中