基本思想

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

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

为什么?首先快指针在环内肯定是可以追上慢指针的对吧,那存不存在一种可能就是快指针恰好跳过了慢指针(因为快指针的步长为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. 64xWin7Orcale安装
  2. vue-cli3.0控制台体验
  3. GoogleReader的Likes操作数据如何获取?
  4. Leetcode上的题目
  5. PAT:1019. 数字黑洞 (20) AC(同甲级1069)
  6. oracle 以1开头以9结尾_为什么你看到的价格总以数字“9”结尾?
  7. LeetCode17——Letter Combinations of a Phone Number(手机几个按键对应的字母(符号)组合)
  8. 关于cmd如何进出文件夹
  9. IOS 线程的总结(及cell的图片下载)
  10. 国内外计算机专业图形图像处理课程现状,计算机图像处理论文
  11. 幼儿抽象逻辑思维举例_幼教科目二 | 幼儿认知的发展(思维)
  12. UWP应用安装提示证书问题的解决办法
  13. mod函数计算机,Excel中mod函数的使用方法
  14. 【LOJ#10064】黑暗城堡
  15. OPENSTACK-210-3-配置网络(Configure networking)-命令行
  16. 数据科学和机器学习中的优化理论与算法(下)
  17. 关于绿色建筑的发展促进,从技术厂家角度我们这么看!
  18. 任务计划服务程序在哪里
  19. 飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人
  20. linux下kegg注释软件,工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧...

热门文章

  1. laravel-admin使用laravel-excel导入数据
  2. Python 自动化-pywinauto库print_control_identifiers()方法打印内容显示不全解决办法,cmd展示更多内容设置方法
  3. 监控Linux服务器状态
  4. .Net Core有哪些不错的开源项目?
  5. openstack“T版“Glance组件部署
  6. vue登录页面设置记住密码
  7. 服务器虚拟机存储池安全,最佳实践:建设统一CEPH存储池
  8. oracle ecology已崩溃,ECOLOGY问题解决方法培训 - 图文
  9. 黑客窃取 4 亿 Twitter 用户记录,勒索马斯克破财消灾
  10. 有关HTML与CSS的重点知识归纳(Pink)