检测链表是否有环, 动画演示, Floyd判圈算法扩展应用

力扣原题链接: 141. 环形链表 - 力扣(LeetCode)

哈希表

检测环形链表, 直观的思路就是使用哈希表, 遍历这个链表, 将访问过的节点加入到哈希表中, 如果遍历过程中发现节点已经存在于哈希表中, 则说明链表有环.

复杂度分析:

  • 时间复杂度: O(N), 最坏情况下需要遍历所有节点.
  • 空间复杂度: O(N), 最坏情况下每个节点都会加入到哈希表.

Floyd判圈算法

另一种更高效的算法是Floyd判圈算法, 又称龟兔赛跑算法, 该算法由计算机科学家罗伯特·弗洛伊德(Robert W. Floyd)提出, 其核心思想是通过两个指针以不同速度遍历链表来判断是否存在环, 并可以进一步确定环的起点和长度.

算法步骤

初始化两个指针:

  • 慢指针: 每次移动一步
  • 快指针: 每次移动两步

两个指针同时从起点出发, 按照各自的速度移动.

判断是否有环:

  • 如果快指针会先到达终点, 则说明链表无环
  • 如果快慢指针相遇, 则说明链表有环

 

动画演示

欢迎关注公众号: 算法铁金库

持续更新数据结构与算法, 动画演示, 理解算法快人一步~

Java代码:

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

 

复杂度分析:

  • 时间复杂度: O(N), 慢指针对每个节点至多访问一次, 快指针访问的节点个数不超过慢指针的2倍.
  • 空间复杂度: O(1), 只需要两个额外指针.

 

思考: 为什么当链表有环, 快慢指针一定能相遇?

如果存在环, 快指针每次比慢指针多走一步, 也就是说距离每次减1, 所以最终一定能相遇.

扩展应用

确定环的起点

当快慢指针首次相遇后, 将其中一个指针移回起点(如慢指针), 然后两个指针改为每次均移动一步. 当它们再次相遇时, 相遇点即为环的起点.

 

证明:

用a表示链表头到环起点的距离

用L表示环的长度

第一阶段: 寻找相遇点

  • 当慢指针走了a步到达环起点时, 快指针已经走了2a步
  • 快指针在环中的位置是 (2a - a) % L = a % L (因为前a步用来走到环起点)
  • 此时快指针需要追赶慢指针, 相对距离是 L - a % L
  • 由于快指针每次比慢指针多走1步, 经过 L - a % L 步后两者相遇
  • L - a % L 就是慢指针在环中移动的长度, 也就是相遇位置距环起点的距离

第二阶段: 确定环起点

  • 将慢指针移回链表头部, 快指针不动, 接下来两个指针每次各走1步
  • 慢指针走了a步到达环起点, 同时快指针也走了a步, 在环中的位置为 L - a % L + a
  • 而 (L - a % L + a) % L = 0, 也就是说该位置就是环起点.

证毕.

计算环的长度

在确定有环后, 固定一个指针, 另一个指针继续移动并计数, 直到再次相遇, 计数结果即为环的长度.

 

 

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

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

相关文章

linux专题3-----linux上链接远程mysql

要在 Ubuntu 上连接远程 MySQL 数据库,你可以使用 MySQL 客户端工具或者其他数据库管理工具,如 phpMyAdmin 或 MySQL Workbench。以下是使用 MySQL 命令行工具连接远程 MySQL 的步骤: 确保已安装 MySQL 客户端 首先,确保你的 Ub…

webpack js 逆向 --- 个人记录

网站 aHR0cDovL2FlcmZheWluZy5jb20v加密参数 参数加密位置 方法: 1. 构造自执行函数 !function(e) {// 加载器 }(// 模块1;// 模块2 )2. 找到js的加载器 3. 把上述代码放入第一步构造的自执行函数(完整扣取一整个加载器里的代码),并用一…

用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目&#xff0c…

基于α-β剪枝的含禁手AI五子棋

前言: 正常的五子棋应当设有禁手规则,否则先手黑棋必赢,基于此点设计出一款包含禁手的AI五子棋项目,该项目代码已在github开源,感兴趣的友友可以自取试玩:ace-trump-tech/AI-Gomoku-with-Prohibition-Moves: 含禁手的A…

Spring Boot 集成 Redis中@Cacheable 和 @CachePut 的详细对比,涵盖功能、执行流程、适用场景、参数配置及代码示例

以下是 Cacheable 和 CachePut 的详细对比,涵盖功能、执行流程、适用场景、参数配置及代码示例: 1. 核心对比表格 特性CacheableCachePut作用缓存方法的返回结果,避免重复计算执行方法并更新缓存,不覆盖原有缓存执行流程缓存命中…

可以使用费曼学习法阅读重要的书籍

书本上画了很多线,回头看等于没画出任何重点。 不是所有的触动都是有效的。就像你曾经看过很多好文章,当时被触动得一塌糊涂,还把它们放进了收藏夹,但一段时间之后,你就再也记不起来了。如果让你在一本书上画出令自己…

Nginx之https重定向为http

为了将Nginx中443端口的请求重定向到80端口,你可以按照以下步骤进行操作: ‌确认Nginx已经正确安装并运行‌: 确保Nginx服务已经在你的系统上安装并运行。你可以通过运行以下命令来检查Nginx的状态(具体命令可能因操作系统而异&a…

【ARTS】【LeetCode-2873】有序三元组中的最大值!

前言 仅做学习使用,侵删 什么是ARTS? 算法(Algorithm): 每周至少一道LeetCode算法题,加强编程训练和算法学习 阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平 技巧 (Tip):学习至少一个技…

基于spring boot 鲜花销售系统PPT(源码+lw+部署文档+讲解),源码可白嫖!

课题意义 随着网络不断的普及发展,鲜花销售系统依靠网络技术的支持得到了快速的发展,首先要从用户的实际需求出发,通过了解用户的需求开发出具有针对性的信息管理系统,利用目前网络给用户带来的方便快捷这一特点对系统进行调整&am…

Redis常用的数据结构及其使用场景

字符串(String) string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如jpg图片或者序列化的对象。 string 类型是 R…

设计模式简述(五)建造者模式

建造者模式 描述基本要素协调类使用 描述 建造者模式属于创造型设计模式。 通常用于构建一系列复杂对象,这些对象有一定的共性。 我们可以通过不同的建造者,组装不同的对象 与工厂模式的区别,建造者模式更侧重与基于基础构件组装而非直接创…

Java基础 4.6

1.成员方法练习 //编写类A:判断一个数是奇数还是偶数,返回boolean //根据行、列、字符打印对应行数和列数的字符,比如:行4 列4 字符# 则打印相应的效果 public class MethodExercise01 {public static void main(String[] args) …

前端快速入门学习4——CSS盒子模型、浮动、定位

一、盒子模型 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充&#xff0c…

瑞数信息发布《BOTS自动化威胁报告》,揭示AI时代网络安全新挑战

近日,瑞数信息正式发布《BOTS自动化威胁报告》,力求通过全景式观察和安全威胁的深度分析,为企业在AI时代下抵御自动化攻击提供安全防护策略,从而降低网络安全事件带来的影响,进一步增强业务韧性和可持续性。 威胁一&am…

Docker设置代理

目录 前言创建代理文件重载守护进程并重启Docker检查代理验证 前言 拉取flowable/flowable-ui失败,用DaoCloud源也没拉下来,不知道是不是没同步。索性想用代理拉镜像。在此记录一下。 创建代理文件 创建docker代理配置 sudo mkdir -p /etc/systemd/s…

Debezium嵌入式连接postgresql封装服务

文章目录 1.项目结构:2.依赖:3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口(表处理抽象)7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…

ER-图,详情和画法

一、E-R图的核心元素 1.实体 表示现实中对象或概念,用矩形表示 示例:用户、老师、学生 2.属性 描述实体的特征,用椭圆表示。 分为主键(用户id) 和非主键(用户昵称) 3.关系 表示实体间的…

Windows Flip PDF Plus Corporate PDF翻页工具

软件介绍 Flip PDF Plus Corporate是一款功能强大的PDF翻页工具,也被称为名编辑电子杂志大师。这款软件能够迅速将PDF文件转换为具有翻页动画效果的电子书,同时保留原始的超链接和书签。无论是相册、视频、音频,还是Flash、视频和链接&#…

Linux文件系统中的Page Cache和内存管理中的Page之间的关系

Linux文件系统中的Page Cache和内存管理中的Page之间有密切的关联,两者在底层机制上紧密结合,共同实现高效的内存和文件系统管理。以下是它们的关系和关键点: 核心关系 Page Cache的底层是内存Page Page Cache是由内存管理中的物理内存页&…

每日一个小病毒(C++)EnumChildWindows+shellcode

这里写目录标题 1. `EnumChildWindows` 的基本用法2. 如何利用 `EnumChildWindows` 执行 Shellcode?关键点:完整 Shellcode 执行示例3. 为什么 `EnumChildWindows` 能执行 Shellcode?4. 防御方法5. 总结EnumChildWindows 是 Windows API 中的一个函数,通常用于枚举所有子窗…