基本思想

快指针:从头开始移动 每次移动两个距离
慢指针:从头开始移动 每次移动一个距离

如果单链表中存在有环的话,那么快慢指针一定是会相遇的。

为什么?首先快指针在环内肯定是可以追上慢指针的对吧,那存不存在一种可能就是快指针恰好跳过了慢指针(因为快指针的步长为2)然后快慢指针就没有相遇了呢?答案是不存在这一种情况的,我们这里首先要明确一点就是“假如没有相遇,又何来的超越呢?”对吧,好比咱俩在操场上跑步,假如你都没有与我相遇那你又何谈超过我,对吧。

当快慢指针首次相遇的时候,慢指针肯定在环内的移动距离肯定没有超过一圈

为什么?假如慢指针在环内移动了第一圈,那在慢指针移动这一圈的过程中,快指针肯定是要超过慢指针的对吧?那么依据之前我们上一条所说的“有超越那就必然有相遇" 所以当快慢指针首次相遇的时候,慢指针的移动距离肯定是没有超过一圈的。

如何确定环的入口

假设单链表的头节点到环入口的距离为m,快慢指针在环内相遇的时候,慢指针在环内已经移动的距离为x,快指针已经移动了n圈,一个环有c个单位长度,那么可以列出一个等式那就是 2×\times×(m+x)=m+n×\times×c+x.从这个等式可以推出:m=n×\times×c-x。依据我们推出来的这个等式,我们就可以设置两个指针,一个指针指向头节点,一个指针指向快慢指针首次相遇的地方。然后两个指针每次移动一步,直到两个指针相等为止。此时两个指针所指向的地址就是单链表中环的入口的地址。

代码

//判断链表是否有环 如果有的话返回环入口
LNode* findLoopStart(LNode* list){//定义一个慢指针LNode* low = list;//定义一个快指针LNode* fast = list;//判断low->next 与 fast->next->next 是否相等while (low->next != NULL && fast != NULL && fast->next != NULL) {//慢指针后移low = low->next;//快指针后移fast = fast->next->next;if (fast != NULL && low != NULL){if (low->next == fast->next){cout<<"该链表存在环"<<endl;break;}}}//fast/fast ->next/low->next == NULL 没有环if (fast == NULL ||fast->next == NULL || low->next == NULL){cout<<"该单链表没有环"<<endl;return 0;}//返回环的入口点//指向快慢指针相遇时的节点LNode* meetPoint = low;//指向链表开头的节点LNode* head = list;//meetPoint = headwhile (meetPoint->data != head->data){//相遇节点后移meetPoint = meetPoint->next;//开始节点后移head = head->next;}//返回环入口return head;
}

如何确定两个单链表是否有交叉

这里我们将其中一个链表的表尾指向另一个链表的表头,假如两个链表有交叉的话那么我们从任意两个链表的表头进行遍历最后肯定可以进入到环中,这里我们就可以用到上面的函数来判断首尾连接后的单链表是否有环.

参考资料

《2021年数据结构考研复习指导》 王道论坛

快慢指针判断链表中是否有环相关推荐

  1. 快慢指针判断链表中是否存在环以及查找环的起始位置

    判断链表中是否有环?    使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环 为什么快指针每次走两步而慢指针每次走一步呢?    因为slow指针和fast指针 ...

  2. 使用快慢指针判断链表是否有环

    有时候在面试中可能会遇到叫我们判断链表中是否有环的问题,这个问题的解决方法也很多,这里我记录一下比较简单的使用快慢指针的方法: 使用快慢指针是指: 设置两个指针,一快一慢,快指的是每次移动两步,慢指针 ...

  3. 【Java】环形链表 ( 给定一个链表,判断链表中是否有环)

    题目描述 :给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 po ...

  4. 牛客题霸 判断链表中是否有环 C++题解/答案

    牛客题霸 判断链表中是否有环 C++题解/答案 题目描述 判断给定的链表中是否有环 扩展: 你能给出空间复杂度的解法么? 题解: 在这介绍一个简便的方法:快慢指针 就是:一个指针走两步,一个指针走一步 ...

  5. 环形链表。给定一个链表,判断链表中是否有环。(GO、PHP)

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

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

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

  7. 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)

    接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...

  8. 链表系列--判断链表中是否有环。

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

  9. 判断链表中是否有环(环形链表)

    题意: 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位 ...

最新文章

  1. 线程常用方法,线程安全和同步锁
  2. 本轮股市行情性质的分析
  3. MVC5路由系统机制详细讲解
  4. html单击按钮时弹出输入框,点击按钮弹出模态框的一系列操作代码实例
  5. spring 源代码地址
  6. [Abp 源码分析]DTO 自动验证
  7. Java 8 Friday Goodies:新的新I / O API
  8. android运行的线程中,android中线程是否运行在单独的进程中?
  9. AGC018F. Two Trees
  10. shader变体是什么_[Unity/shaderlab]关于着色器变体
  11. java static 对象加锁_java安全编码指南之:lock和同步的正确使用
  12. How to tie your shoes [by:姚铭]
  13. 如何用PS制作1寸证件照
  14. SpringBoot使用模板动态导出PDF使用itextpdf
  15. 阿里云网盘内测_阿里一口气推出两款网盘,不限速!
  16. Abbirb120型工业机器人_ABB机器人IRB120资料的详细介绍
  17. paddle 图标注_UI进阶干货 如何标注才能高度还原设计稿?
  18. Suit and Tie (在线swap 贪心 思维)
  19. 【loadrunner】——利用loadrunner进行压力测试
  20. 微服务架构Day04-SpringBoot之web开发配置

热门文章

  1. Java设计模式—门面模式(带案例分析)
  2. UML类图中连接线与箭头的含义(转)
  3. 各地区收入差距不平等、基尼系数、省级层面(分城镇和乡村)
  4. 数据库管理-第二十二期 记一系列问题处理(20211109)
  5. css外部命名规范,前端开发较全CSS命名规范
  6. 订婚和结婚分别要拿多少钱 订婚钱和彩礼钱的区别
  7. 决策易|医药代表绩效管理激励体系
  8. python 爬虫爬取所有上市公司公告信息(五)
  9. Android RatingBar结合属性动画,快速实现 QQ群男女比例分布图效果
  10. 学计算机有什么用处400字,计算机日常使用注意些什么?作文400字_四年级作文400字-98作文网...