算法——Floyd判圈算法

news2024/10/5 13:02:16

介绍

Floyd判圈算法用于判断一个链表中是否有环

思想

使用快慢指针fast, slow,快指针每次走两步fast = fast.next.next,慢指针每次走一步slow = slow.next。当出现fast == null || fast.next == null时,说明链表不存在环,如果存在环,则快指针永远不可能指向null;当出现fast == slow时,说明链表存在环,此时让慢指针回到原点,然后让两个指针的速度相同,每次都只走一步fast = fast.next; slow = slow.next;它们再次相遇的点就是环的入口

论证

图1

对于上面的这张图,不妨设两个指针在点R处第一次相遇,此时让慢指针回到链表头部点P处,让快慢指针同速,每次只走一步,直到第二次相遇。注意,指针在环上是逆时针走的。

第一次相遇时,有 2 t = s f a s t = ∣ P Q ∣ + m C + Q R ⌢ 2t = s_{fast} = |PQ| + mC + \overset{\LARGE{\frown}}{QR} 2t=sfast=PQ+mC+QR t = s s l o w = ∣ P Q ∣ + n C + Q R ⌢ t = s_{slow} = |PQ| + nC + \overset{\LARGE{\frown}}{QR} t=sslow=PQ+nC+QR 其中 s f a s t s_{fast} sfast是第一次相遇前快指针走的距离, s s l o w s_{slow} sslow是第一次相遇前慢指针走的距离, ∣ P Q ∣ |PQ| PQ是点 P P P和点 Q Q Q之间的距离(也就是链表的起点到环的入口的长度), m m m是第一次相遇前快指针绕环转的圈数, n n n是第一次相遇前慢指针绕环转的圈数, C C C是环的周长, Q R ⌢ \overset{\LARGE{\frown}}{QR} QR是从点 Q Q Q沿环逆时针到点 R R R的距离, t t t是移动的次数(快指针每次走两步,慢指针每次走一步)。

用第一个式子减去第二个式子,得 t = ( m − n ) C t = (m - n)C t=(mn)C 再将第三个式子带入第二个式子可得 ∣ P Q ∣ + Q R ⌢ = ( m − 2 n ) C |PQ| + \overset{\LARGE{\frown}}{QR} = (m - 2n)C PQ+QR=(m2n)C 也就是说 ∣ P Q ∣ |PQ| PQ Q R ⌢ \overset{\LARGE{\frown}}{QR} QR的和为环的周长的整数倍,从而可知 ∣ P Q ∣ |PQ| PQ就是从点 R R R沿环逆时针到点 Q Q Q的距离 R Q ⌢ \overset{\LARGE{\frown}}{RQ} RQ,即有 ∣ P Q ∣ = R Q ⌢ |PQ| = \overset{\LARGE{\frown}}{RQ} PQ=RQ

现在考虑第一次相遇与第二次相遇之间的事情,慢指针从链表头部(点 P P P)开始遍历,快指针从第一次相遇的点(点 R R R)开始遍历,慢指针的路程是 ∣ P Q ∣ |PQ| PQ,快指针的路程是 R Q ⌢ \overset{\LARGE{\frown}}{RQ} RQ,由上面的证明 ∣ P Q ∣ = R Q ⌢ |PQ| = \overset{\LARGE{\frown}}{RQ} PQ=RQ可知:它们的第二次相遇点就是环的入口 Q Q Q

从而当两个指针第二次相遇时,它们指向的点就是环的入口得证。

代码

对链表节点的定义如下:

class ListNode {
	int val;
	ListNode next;
	ListNode(int x) {
		val = x;
		next = null;
	}
}

判断链表是否有环的代码如下:

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            
            if (slow == fast) {
                return true;
            }
        }
        return false;
    }
}

求环的入口的代码如下:

class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;

            if (slow == fast) {
                slow = head;
                while (slow != fast) {
                    slow = slow.next;
                    fast = fast.next;
                }
                return slow;
            }
        }
        return null;
    }
}

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

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

相关文章

【python报错】关于 xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决方法【已解决】

【Python报错】关于xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法【已解决】 在使用Python进行数据分析时,经常需要处理Excel文件。xlrd库是一个流行的用于读取Excel文件的库,但如果你在使用xlrd打开.xlsx文件时遇到了xlrd.biffh.XLRDE…

欢乐打地鼠小游戏html源码

这是一款简单的js欢乐打地鼠游戏,挺好玩的,老鼠出来用鼠标点击锤它,击中老鼠获得一积分。 欢乐打地鼠小游戏html源码

信息系统项目管理师0150:工具与技术(9项目范围管理—9.4收集需求—9.4.2工具与技术)

点击查看专栏目录 文章目录 9.4.2 工具与技术9.4.2 工具与技术 专家判断 收集需求过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:可行性研究与评估;需求获取;需求分析;需求文件;以往类似项目的项目需求;图解技术;引导;冲…

这个国际档案日,大比武放榜、直播预约、课件下载,一样都不能少!

关注我们 - 数字罗塞塔计划 - 2024年6月9日第十七个国际档案日来临,数字罗塞塔计划放大招:第二届大比武活动榜单揭晓、ARCHE-2024上海智慧档案高峰论坛直播预约、2024上半年度课件大礼包下载。如此大礼,岂能错过? PART.01 榜单…

通过 Python+Nacos实现微服务,细解微服务架构

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 背景 一直以来的想法比较多,然后就用Python编写各种代码脚本。很多…

【线性代数】向量空间,子空间,向量空间的基和维数

向量空间 设V为n维向量的集合,如果V非空,且集合V对于向量的加法以及数乘两种运算封闭,那么就称集合V为向量空间 x,y是n维列向量。 x 向量组等价说明可以互相线性表示 向量组等价则生成的向量空间是一样的 子空间 例题18是三位向…

4.大模型微调技术LoRA

大模型低秩适配(LoRA)技术 现有PEFT 方法的局限与挑战 Adapter方法,通过增加模型深度而额外增加了模型推理延时。Prompt Tuning、Prefix Tuning、P-Tuning等方法中的提示较难训练,同时缩短了模型可用的序列长度。往往难以同时实现高效率和高质量,效果通常不及完全微调(f…

【每日算法】

算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归) 文章目录 算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归)一、层序遍历二、226. 翻转二叉树(优先掌握递归)三、101. 对…

小程序中实现自定义头部导航组件

在页面中实现自定义头部导航的组件,如果仅是单个页面中需要自定义可在页面的json文件中配置"navigationStyle": “custom”,如果是项目中所有页面都想使用自定义的组件,可在app.json的window中全局配置"navigationStyle"…

2024-6-9

今日安排: 学校的课程作业windows SEH 机制简单入门windows 用户态 pwn / 内核态入门 计网实验报告 && 网安实验报告继续审计 nf_tables 源码,主要看 active 相关逻辑。复现 CVE-2022-32250 这个漏洞【 && iptables 相关学习】♥♥♥♥…

【车载开发系列】MCU选型

【车载开发系列】MCU选型 【车载开发系列】MCU选型 【车载开发系列】MCU选型一. 重要概念二. MCU选型的风险风险1风险2 三. MCU选型要点四. MCU选型维度五. MCU 选型需要考虑的因素1)ROM/RAM2)速度/主频3)分析外设需求4)工作电压(…

idea编码问题:需要 <标识符> 非法的类型 、需要为 class、interface 或 enum 问题解决

目录 问题现象 问题解决 问题现象 今天在idea 使用中遇到的一个编码的问题就是&#xff0c;出现了这个&#xff1a; Error:(357, 28) java: /home/luya...........anageService.java:357: 需要 <标识符> Error:(357, 41) java: /home/luya............anageService.ja…

表达式求值的相关语法知识(C语言)

目录 整型提升 整型提升的意义 整型提升规则 整型提升实例 算术转换 赋值转换 操作符的属性 C语言的语法并不能保证表达式的执行路径唯一&#xff01;&#xff01;&#xff01; 问题表达式 整型提升 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这…

基于SSM+Jsp的家用电器销售网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【锂电池剩余寿命RUL预测案例】 锂电池寿命预测 | Matlab基于SSA-SVR麻雀优化支持向量回归的锂离子电池剩余寿命预测&#xff08;完整源码和数据&#xff09; 1、提取NASA数据集的电池容量&#xff0c;以历史容量作…

LLVM Cpu0 新后端10

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

GitLab代码导出 gitlab4j-api 实现

目录 GitLab简介 GitLab 的主要特点包括&#xff1a; GitLab代码导出 gitlab4j-api 添加 gitlab4j-api 依赖 使用 gitlab4j-api 获取特定命名空间下的所有项目 说明 注意事项 GitLab简介 GitLab 是一个开源的代码仓库和协作平台&#xff0c;主要用于版本控制和源代码管理…

无人用过!QRTCN-BiLSTM实现区间预测!区间预测全家桶再更新!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 今天对我们之前推出的区间预测全家桶再次进行更新&…

SPSS 27 安装教程(附安装包下载)

SPSS 27 是一款用于统计学分析运算、数据挖掘、预测分析和决策支持任务的软件产品。它最初是为社会科学领域的研究者设计的&#xff0c;但随着其功能和应用的不断扩展&#xff0c;现在已广泛应用于各个领域&#xff0c;如医学、市场调研、教育等。 [安装注意]&#xff1a;安装前…

智能制造 v3.13.11 发布,ERP、在线课堂、表白墙更新

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…