检测链表是否有环

2024-02-20 22:08
文章标签 链表 是否 检测 有环

本文主要是介绍检测链表是否有环,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 如何检测一个链表是否有环

具体步骤如下:

(1)定义两个指针 fast(快指针) 与 slow(慢指针),二者的初始值都指向链表头;
(2)slow 每次前进一步,fast 每次前进两步,两个指针同时前进;
(3)快指针每移动一次都要跟慢指针比较,直到快指针等于慢指针为止,就证明这个链表是带环的单向链表,否则证明这个链表是不带环的循环链表(fast 先行到达尾部为 null,则为无环链表)。

具体实现如下:

 public boolean isLoop(Node head) {Node fast = head;Node slow = head;if(fast == null)return false;while(fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if(fast == slow){return true;}}return !(fast == null || fast.next == null);}

上述方法只能判断链表是否有环,但不能判断环的位置。

2. 如何找到换的入口点

为了判断环的位置,我们需要找到换的入口点,那么如何找到换的入口点呢?

如果单链表有环,按照上述思路,当 fast 与 slow 相遇时, slow 指针肯定没有遍历完链表,而 fast 指针已经在环内循环了 n ( n >= 1 ) 圈。

这里写图片描述

假设 slow 指针走了 s 步,则 fast 指针走了 2s 步(fast 步数还等于 s 加上在环上多转的 n 圈)。设环长为 r,则满足如下关系表达式:

            2s = s + nrs = nr

设整个链表而长度为 L,入口环与相遇点的距离为 x,起点到环入口的距离为 a, 则满足如下表达式:

         a + x = nra + x = (n-1)r + r = (n-1)r + L-aa = (n-1)r + (L-a -x)

(L - a - x) 为相遇点到环入口的距离,从链表头到环入口点等于 (n - 1)循环 + 相遇点到环入口点。

经过上面的分析,可以总结该方法的步骤为:

(1)找到相遇点,并标记为 fast;
(2)在链表头也设置一个指针 slow;
(3)fast 和 slow 指针一起前进,每次各走一步,两个指针必定相遇。且相遇第一点为环入口点。

具体实现如下:

public Node findLoopPort(Node head) {Node slow = head;Node fast = head;while(fast != null && fast.next != null) {// 先找到相遇点slow = slow.next;fast = fast.next.next;}if(fast == null || fast.next == null)return null;slow = head;while(slow != fast) {//slow 从头开始和相遇点 fast 一起向前移动slow = slow.next;fast = fast.net;}return slow;
}

这篇关于检测链表是否有环的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729675

相关文章

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定