检测链表是否有环

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

相关文章

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

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

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

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

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

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

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖