题目描述

给定一个链表,判断链表中是否有环

题目链接

141. 环形链表

解题思路

使用快慢指针(Floyd判圈算法):从链表的头部设置两个指针,p1的步长为1, p2的步长为2,同时向前走,如果p1和p2最终能够相遇,则说明链表是有环的。

检测环的基本思想是非常简单的,可以类比成两个人在跑道上跑。只要有圈,跑的快的那个人就一定能够追上跑得慢的那个人。

代码:

public class Solution {public boolean hasCycle(ListNode head) {if (head == null) {return false;}   //设置快慢指针ListNode slow = head, fast = head.next;while(slow!=null&&fast!=null&&fast.next!=null){if(slow == fast){return true;}slow = slow.next;fast = fast.next.next;}return false;}
}

扩展

  1. 求环的长度

    两个人相遇的是时候,一定已经在环上了,然后两个人只要再次在环上接着跑,再次相遇的时候(也就是所谓的套圈),跑的快的那个人就比跑得慢的人整整多跑了一圈,所以环的长度也就出来了。

    用算法来描述:第一次相遇后,p1和p2按照原来的步长继续向前查找,并且记录下两个指针遍历过的节点个数。当两个指针再次相遇的时候,遍历的节点数量差就是环的长度。

  2. 求环的起点

    解决方法
    把其中的一个指针重置到链表头部,然后两个指针步长都为1,继续向前移动,相遇的位置即为环的起点。

    解释:
    首先我们设第一次相遇的时候慢指针走过的节点个数为i, 设链表头部到环的起点的长度为m, 环的长度为n,相遇的位 置与起点位置距离为k
    则可以得到:
    i = m + a * n + k

    其中a为慢指针走的圈数。
    根据快指针和慢指针的速度关系,我们可以得到另一个式子:
    2 * i = m + b * n + k

    其中b为快指针走的圈数。
    简单处理得到:
    i = (b - a) * n

    也就是说i是圈长的整数倍。
    这时将其中一个节点放到起点,然后同时向前走m步时,此时从头部走的指针在m位置。而从相遇位置开始走的指针应该在距离起点i + m, i为圈长整数倍,则该指针也应该在距离起点为m的位置,即环的起点。

参考

  • Floyd判圈算法
  • Floyd判圈算法
  • Floyd判圈算法(龟兔赛跑算法)

快慢指针:141. 环形链表(判断是否存在环路)相关推荐

  1. 【LeetCode】【HOT】141. 环形链表(快慢指针)

    [LeetCode][HOT]141. 环形链表 文章目录 [LeetCode][HOT]141. 环形链表 package hot;class ListNode{int val;ListNode n ...

  2. LeetCode 141. 环形链表 简单难度

    ** 141. 环形链表 ** 给定一个链表,判断链表中是否有环. 如果链表中存在环,则返回 true . 否则,返回 false . 解题思路(两种方法): 方法一:用集合set以及set.find ...

  3. LeetCode141. 环形链表判断链表是否有环

    题目要求 原题目链接:141. 环形链表 题目要求如下: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了 ...

  4. 【Leetcode】拿捏链表(四)——160. 相交链表、141. 环形链表、142. 环形链表 II

    作者:一个喜欢猫咪的的程序员 专栏:<Leetcode> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽.                                  --<人民 ...

  5. 141. 环形链表 golang

    141. 环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

  6. LeetCode - 141. 环形链表

    141. 环形链表 import java.util.Objects;class ListNode {int val;ListNode next;ListNode(int x) {val = x;ne ...

  7. 【LeetCode笔记】141. 环形链表(Java、快慢指针、链表)

    文章目录 题目描述 思路 & 代码 题目描述 常见题,用上了久违的快慢指针 思路 & 代码 举个例子就能明白了: 我和汽车,进行一场比赛,跑道可能是环形跑道,也可能是直道. 直道的话, ...

  8. leetcode 141. 环形链表(快慢指针解法)

    题目 思路 绝对的经典题目,快慢指针,慢指针一次走两步,快指针一次走一步,直到两指针相遇,则说明有环. 关于评论区看到的一种思路,本质是做标记.这个办法不是很好,一方面,如果测试用例足够全的话,标记内 ...

  9. leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

    ⭐️ 环形链表 I 题目描述 给你一个链表的头节点 head ,判断链表中是否有环.如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 如果链表中存在环 ,则返回 tru ...

最新文章

  1. 排除hotnews主题内容页面上的热点图片推荐里的分类-hotnews主题top_hot.php
  2. 分享几段祖传的Python代码,拿来直接使用!
  3. 组合数据类型练习,英文词频统计实例9-21
  4. 数据结构练习 00-自测3. 数组元素循环右移问题 (20)
  5. (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像
  6. 按钮跳转到其他ui界面_《明日方舟》UI/UX设计复盘
  7. 02HTML 超链接与图像标记各是什么,【HTML篇】3.HTML的图片标签、超链接标签
  8. go语言学习相关资料
  9. Win10之广告弹窗终结器:Process Explorer
  10. oracle获取当前年上一年时间,Oracle获取一年中的所有日期和一个月中的所有日期...
  11. 博士德服务器帐套维护密码忘记,T+账套主管的密码忘记了,怎么办
  12. 车机常用adb 命令总结
  13. Appium连接教程
  14. android删除无用资源文件,android删除无用资源文件的python脚本
  15. 什么是外网IP、内网IP?
  16. 典型相关分析(Canonical correlation analysis)(四): 中国城市竞争力与基础设施的相关分析
  17. php theexcerpt,WordPress获取文章摘要函数the_excerpt、get_the_excerpt
  18. php连接mysql 500错误日志_php javascript从mysql获取数据会在服务器端产生500错误
  19. Activiti7工作流入门和基本使用-工作流引擎介绍
  20. 3种方法封锁BT下载 1

热门文章

  1. HDU - 2204 Eddy‘s爱好(尚未完全解决)
  2. CF750G New Year and Binary Tree Paths(数位dp二进制+数学)
  3. CF464E-The Classic Problem【最短路,主席树】
  4. jzoj2292-PPMM【模拟,堆】
  5. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】
  6. jzoj3171-[GDOI2013模拟4]重心【真·物理,二分】
  7. 【Trie】最长异或路径(ybtoj Trie-3/luogu 4551)
  8. 线段树专题-等差子序列 BZOJ-2124
  9. Spring JSR-250 注释
  10. ByteBuffer的使用