快慢指针【等分链表、判断链表中是否存在环】

一、等分链表:找到链表的中间节点

Java 实现
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;this.next = null;}
}public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head == null) {return null;}ListNode slow = head;ListNode fast = head;// 快指针每次走两步,慢指针每次走一步while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}// 慢指针指向中间节点return slow;}public static void main(String[] args) {// 示例链表:1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);MiddleOfLinkedList solution = new MiddleOfLinkedList();ListNode middle = solution.findMiddleNode(head);System.out.println("中间节点值: " + middle.val); // 输出: 3}
}
示例

输入链表:1 -> 2 -> 3 -> 4 -> 5
输出:3

输入链表:1 -> 2 -> 3 -> 4 -> 5 -> 6
输出:4


二、判断链表中是否存在环

Java 实现
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;this.next = null;}
}public class LinkedListCycle {public ListNode detectCycle(ListNode head) {if (head == null || head.next == null) {return null;}ListNode slow = head;ListNode fast = head;// 判断是否有环while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;// 快慢指针相遇,说明有环if (slow == fast) {break;}}// 无环if (fast == null || fast.next == null) {return null;}// 找到环的入口fast = head;while (fast != slow) {fast = fast.next;slow = slow.next;}return slow;}public static void main(String[] args) {// 示例链表:1 -> 2 -> 3 -> 4 -> 5 -> 2(节点5指向节点2,形成环)ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);head.next.next.next.next.next = head.next; // 形成环LinkedListCycle solution = new LinkedListCycle();ListNode cycleNode = solution.detectCycle(head);if (cycleNode != null) {System.out.println("环的入口节点值: " + cycleNode.val); // 输出: 2} else {System.out.println("链表中无环");}}
}
示例

输入链表:1 -> 2 -> 3 -> 4 -> 5 -> 2(节点5指向节点2,形成环)
输出:2

输入链表:1 -> 2 -> 3 -> 4 -> 5
输出:链表中无环


三、核心思想总结

  1. 快慢指针的速度差

    • 快指针每次移动两步,慢指针每次移动一步;
    • 在等分链表中,快指针到达末尾时,慢指针正好在中间;
    • 在判断环时,快指针会追上慢指针。
  2. 时间复杂度

    • 等分链表:O(n),其中 n 是链表长度;
    • 判断环:O(n),最多遍历链表两次。
  3. 空间复杂度O(1),只使用了常数级别的额外空间。


四、练习题

  1. 等分链表

    • 输入:1 -> 2 -> 3 -> 4 -> 5 -> 6
    • 输出:4
  2. 判断环

    • 输入:1 -> 2 -> 3 -> 4 -> 5 -> 3(节点5指向节点3,形成环)
    • 输出:3

通过 Java 实现 快慢指针技巧,可以高效解决链表中的常见问题。掌握这一技巧,链表问题将不再是难题!

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

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

相关文章

系统架构设计师—计算机基础篇—计算机网络

文章目录 网络互联模型网络协议与标准应用层协议FTP协议TFTP协议 HTTP协议HTTPS协议 DHCP动态主机配置协议DNS协议迭代查询递归查询 传输层协议网络层协议IPV4协议IPV6协议IPV6数据报的目的地址IPV4到IPV6的过渡技术 网络设计分层设计接入层汇聚层核心层 网络布线综合布线系统工…

计算机基础面试(操作系统)

操作系统 1. 什么是进程和线程?它们的核心区别是什么? 专业解答: 进程是操作系统分配资源的基本单位,拥有独立的内存空间;线程是进程内的执行单元,共享同一进程的资源。区别在于:进程间资源隔离…

考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)

一、线性表基础概念 1.1 定义与分类 定义:线性表是由n(n≥0)个相同类型数据元素构成的有限序列,元素间呈线性关系。 分类: 顺序表:元素按逻辑顺序存储在一段连续的物理空间中(数组实现&…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比: 1.2 倒排索引核心结…

Springboot项目本地连接并操作MySQL数据库

目录 前提 准备工作 用cmd在本地创建数据库、表: 1.创建springboot项目(已有可跳过) 2.编辑Mybatis配置 3.连接数据库 4.创建模型类,用于与数据库里的数据表相连 5.创建接口mapper,定义对数据库的操作 6.创建…

《宝塔 Nginx SSL 端口管理实战指南:域名解析、端口冲突与后端代理解析》

📢 Nginx & SSL 端口管理分析 1️⃣ 域名解析与 SSL 申请失败分析 在使用宝塔申请 www.mywebsite.test 的 SSL 证书时,遇到了解析失败的问题。最初,我认为 www 只是一个附加的前缀,不属于域名的关键部分,因此只为…

java和Springboot和vue开发的企业批量排班系统人脸识别考勤打卡系统

演示视频: https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能: 管理员管理员工,采集员工人脸特征值存入数据库,可选择多个员工批量排班…

DeepSeek学习规划

DeepSeek是一个专注于深度学习和人工智能技术研究与应用的平台,旨在通过系统化的学习和实践,帮助用户掌握深度学习领域的核心知识和技能。为了在DeepSeek平台上高效学习,制定一个科学合理的学习规划至关重要。以下是一个详细的学习规划&#…

打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题

一、关联文章: 1、Docker Desktop 安装使用教程 2、家庭版 Windows 安装 Docker 没有 Hyper-V 问题 3、安装 Windows Docker Desktop - WSL问题 二、问题解析 打开 Docker Desktop 出现问题,如下: Docker Engine Stopped : Docker引擎停止三、解决方法 1、检查服务是否…

突破Ajax跨域困境,解锁前端通信新姿势

一、引言 在当今的 Web 开发领域,前后端分离的架构模式已经成为主流,它极大地提升了开发效率和项目的可维护性。在这种开发模式下,前端通过 Ajax 技术与后端进行数据交互,然而,跨域问题却如影随形,成为了开…

Mercury、LLaDA 扩散大语言模型

LLaDA 参考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo: https://chat.inceptionlabs.ai/ 速度很快生成

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust语言圣经中定义 str Rust 语言类型大致分为两种:基本类型和标准库类型,前者由语言特性直接提供,后者在标准库中定义 str 是唯一定义在 Rust 语言特性中的字符串,但也是几乎不会用到的字符串类型 str 字符串是 DST 动态大小…

大数据SQL调优专题——底层调优

引入 上一篇我们提到了调优的常见切入点,核心就是通过数据产出情况发现问题,借助监控等手段收集信息排查瓶颈在哪,最后结合业务理解,等价重写思路去解决问题。 在实际工作场景中,去保证数据链路产出SLA的时候&#x…

Hue 编译异常:ImportError: cannot import name ‘six‘ from ‘urllib3.packages‘

个人博客地址:Hue 编译异常:ImportError: cannot import name six from urllib3.packages | 一张假钞的真实世界 在编译Hue的时候出现错误信息如下: Running /home/zhangjc/ysten/git/ysten-hue/build/env/bin/hue makemigrations --noinpu…

计算机网络——详解TCP三握四挥

文章目录 前言一、三次握手1.1 三次握手流程1.2 tcp为什么需要三次握手建立连接? 二、四次挥手2.1 四次挥手流程2.2 为什么是四次,不是三次?2.3 为什么要等待2msl?2.4 TCP的保活计时器 前言 TCP和UDP是计算机网络结构中运输层的两…

# C# 中堆(Heap)与栈(Stack)的区别

在 C# 中,堆和栈是两种不同的内存分配机制,它们在存储位置、生命周期、性能和用途上存在显著差异。理解堆和栈的区别对于优化代码性能和内存管理至关重要。 1. 栈(Stack) 1.1 定义 栈是一种后进先出(LIFO&#xff0…

如何把图片或者图片地址存到 MySQL 数据库中以及如何将这些图片数据通过 JSP 显示在网页中

如何优雅地管理图片:从MySQL数据库存储到JSP展示的全流程解析 在互联网时代,一张引人入胜的图片往往能为网站带来巨大的流量。而作为开发者的我们,如何高效地管理和展示这些图片资源则成为了一项重要的技术挑战。今天,我们就一起…

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载 在游戏和视频播放时,你是否遇到过分辨率不匹配、画质模糊的问题?今天给大家介绍一款神器——Lossless Scaling(拼好帧),也被玩家们亲切地称为“小黄鸭”&#xff0…

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态,电调控制电机转速,遥控器通道控制飞行动作。电池C…

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连,发挥着不可替代的重要作用。人工智能技术的迅猛发展,为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息,助力人类更精准地把握自然规律&am…