环形链表(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的原理讲解

一:题目

二:原理讲解

解决这个题目 ,我们得先理解它的原理。

1:

首先假设两个指针,一个快指针fast,一个慢指针slow,fast一次移动两个节点,slow一次移动一个节点。(前面的直线代表进入环前面的节点,后面的圆圈就代表入环后的所有节点)

由博主前文环形链表(判断链表中是否有环)的讲解-CSDN博客可知,如果这是一个带环链表,那么二者fast和slow,最后会在环里相遇。 

2:

二者相遇

第一种情况:

此时:我们假设起点到入口点的距离为L,环的周长为C,入口点到相遇点的距离为X。

因为:在截止相遇的那一刻,fast走的距离是slow的两倍。

由上图可知,slow走的距离为L+X,fast走的距离是L+C+X,

所以 2(L+X )= L+C+X,化简可得,L = C - X。

L = C - X是什么意思,意思就是,如果一个点从相遇点开始走(相遇点到入口点的距离是C-X),一个点从起点开始走(起点到入口点的距离是L),他们会在入口点相遇。

这个结论的意义是什么?

意义在于 :入口点就是我们题目要求的入环的第一个节点,而相遇点我们在前文中环形链表(判断链表中是否有环)的讲解-CSDN博客可以轻松得到。

但是这个分析是不完整的。

不完整的原因:

(因为还有第二种情况)

如果L = C - X,由图可知,当环比较小的时候,比如图中的C=4,进环前的节点很多的时候。

L = C - X,在这种情况下不会成立。

3:

完整的分析:

fast走的路程的确是slow 的两倍,但是fast不一定只是L+C+X,在第二种情况我们可以知道,fast应该在slow进入环之前,就已经可能在这个环内走了几圈。

所以正确的表达式应该是:2(L+X )= L+ n * C + X 。 

n代表走的圈数:

由情况1可知,在slow进入环之前,fast在环内走的长度一圈都没有,在slow进入环后,fast开始追赶,最后走了一点距离,追上了slow,此时fast在slow进入环之前在环里走的距离+在slow进入环之后在环里追击所走的距离= 一圈,所以n的最低取值为1。(n≥1)

将2(L+X )= L+ n * C + X ,化简得到:L =  C - X + (N-1) * C。

怎么理解 情况2 的结论:L =  C - X + (N-1) * C  和 情况1: L = C - X  的区别?

情况1:如果一个指针a从相遇点开始走,一个指针b从起点开始走,他们会在入口点相遇。

情况2:如果一个指针a从相遇点开始走,一个指针b从起点开始走,他们会在入口点相遇。

看似两者一致,但是区别在于:

情况1:a指针从相遇点开始走到和b指针在入口点相遇的时候,a指针在环内只走了 C - X,一圈不到的长度。

情况2:a指针从相遇点开始走到和b指针在入口点相遇的时候,a指针在环内走了 C - X + (N-1) * C ,走了N-1圈 ,然后再走了C - X 的长度。

代码展示:

结论:当我们通过快慢指针得到相遇节点,一个指针从相遇节点开始走,一个指针从起点开始走,二者会在环的入口节点相遇。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MF自定义控件方法

在MFC中,您可以通过自定义控件来实现特定的用户界面元素或功能,以满足您的应用程序需求。自定义控件通常是从CWnd类派生的子类,您可以在其中重写绘制、处理事件等方法,以实现您想要的功能和外观。以下是一般步骤: 创建…

【Java】变量类型

类变量:独立于方法之外的变量,用static修饰实例变量:独立于方法之外的变量,不过没有static修饰局部变量:类的方法中的变量 示例1: public class test_A {static int a;//类变量(静态变量)String b;//实例…

【JAVA进阶篇教学】第十篇:Java中线程安全、锁讲解

博主打算从0-1讲解下java进阶篇教学,今天教学第十篇:Java中线程安全、锁讲解。 当涉及到多线程编程时,保证线程安全是至关重要的。线程安全意味着在多个线程访问共享资源时,不会发生数据错乱或不一致的情况。为了实现线程安全&am…

问题:幂等性 分布式session

web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成,举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页,现在在toTrade请求中使用异步任务编排Completab…

微信授权登录02-移动端

目录 ## 前言 1.准备工作 1.1 网站域名 1.2 微信公众号 2.授权登录开发 2.1 前端开发 2.1.1 调起微信授权页面 ## 调起微信授权页面效果图 2.1.2 用户允许授权后回调处理 2.2 后端开发 2.2.1 根据code查询用户信息 2.2.2 自动注册登录 ## 后记 ## 前言 上一篇写…

Nios-II编程入门实验

文章目录 一 Verilog实现流水灯二 Nios实现流水灯2.1 创建项目2.2 SOPC添加模块2.3 SOPC输入输出连接2.4 Generate2.5 软件部分2.6 运行结果 三 Verilog实现串口3.1 代码3.2 引脚3.3 效果 四 Nios2实现串口4.1 sopc硬件设计4.2 top文件4.3 软件代码4.4 实现效果 五 参考资料六 …

nodeJs用ffmpeg直播推流到rtmp服务器上

总结 最近在写直播项目 目前比较重要的点就是推拉流 自己也去了解了一下 ffmpeg FFmpeg 是一个开源项目,它提供了一个跨平台的命令行工具,以及一系列用于处理音频和视频数据的库。FFmpeg 能够执行多种任务,包括解封装、转封装、视频和音频…

Ps各种修改文字超实用方法

介绍 在日常生活中,难免会遇到进行文字修改的ps场景,此时就需要用到比较专业的ps进行文字修改,博主特意整合了多种情况下的文字p图方法进行记录,但是不包含全部情况,只记录日常中常见的情况,也可以解决大部分场景了 原图有可用文字素材 在p图时,我们可以先观察我们要p的图中…

【ARMv8/v9 系统寄存器 5 -- CPU ID 判断寄存器 MPIDR_EL1 使用详细介绍】

文章目录 寄存器名称: MPIDR_EL1寄存器结构:主要功能和用途亲和级别(Affinity Levels)简介CORE ID 获取函数 在ARMv8-A架构中, MPIDR_EL1寄存器是一个非常重要的系统寄存器,它提供了关于处理器在其物理和逻辑配置中的位置的信息。…

Linux下安装JDK并配置环境变量

一、Oracle官网下载jdk 1、官网地址 https://www.oracle.com/java/technologies/downloads/#java17 2、命令下载 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 3、解压 tar -zxvf jdk-17_linux-x64_bin.tar.gz 4、配置环境变量 ec…

webrtc windows 编译,以及peerconnection_client

webrtc windows环境编译,主要参考webrtc官方文档,自备梯子 depot tools 安装 Install depot_tools 因为我用的是windows,这里下载bundle 的安装包,然后直接解压,最后设置到环境变量PATH。 执行gn等命令不报错&…

SQLite .journal 文件

在之前插入大量数据测试的时候,发现在数据库文件同级目录下会产生一个同名.journal的文件,并且不是一直会存在,而是生成一会就会自动删除,然后继续生成继续删除,直到数据插入完成。 初步猜测,应该是类似 re…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址:GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架,重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址:GitHub - tokio-rs/axum: …

Unity开发中导弹路径散射的原理与实现

Unity开发中导弹路径散射的原理与实现 前言逻辑原理代码实现导弹自身脚本外部控制脚本 应用效果结语 前言 前面我们学习了导弹的追踪的效果,但是在动画或游戏中,我们经常可以看到导弹发射后的弹道是不规则的,扭扭曲曲的飞行,然后击…

国产操作系统下使用dpkg命令管理软件包 _ 统信 _ 麒麟 _ 中科方德

往期好文:国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello,大家好啊!在Linux系统中,dpkg是Debian包管理系统的基础命令工具,它允许用户安装、卸载、查询和管理软件包。在国产操作系统如统信UOS和麒麟KOS、中科方…

精选多个炫酷的数据可视化大屏(含源码),拿走就用~

末尾有链接 演示地址:可视化大数据展示中心 (null.fit) 可视化大数据展示模板-科技语者 (chgskj.cn)

Nginx 基于域名的虚拟主机的配置实验

目录 虚拟主机解释 实验介绍 修改配置文件 一:创建2个虚拟主机的网页根目录 二:修改2个虚拟主机的首页的内容 三:真实机器添加域名解析记录 四:测试 虚拟主机解释 Nginx的虚拟主机是指一台服务器上同时托管多个网站的能力。…

Mysql 日志(redolog, binlog, undoLog)

重做日志-redolog 是什么 innoDB存储引擎层面的日志,它的作用是当 数据更新过程中数据库发生异常导致提交的记录丢失 为什么 mysql的基本存储结构是页(记录都在页里面),所以更新语句时,mysql需要先把要更新的语句找…

厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中

一、写在开头 我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能(一键看原文),当时我们经过测试数据的反复测验,100万条放在excel中的数据,4个字段的情况下,导入数据库,平均耗…

LibreNMS简介

目录 1 LibreNMS简单介绍1.1 LibreNMS介绍 2 安装2.1 Ubuntu安装1、安装依赖2、添加 librenms 用户3、下载 LibreNMS4、设置权限5、安装 PHP 依赖项6、设置时区7、配置 MariaDB8、配置 PHP-FPM9、配置 Web 服务器10、启用 lnms 命令11、配置 snmpd12、cron13、启用调度程序14、…