数据结构 - 如何找到有环单链表的环的入口位置(C++)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
template<class T>Node<T> *SingleLinkedList<T>::getLoopEntrance(){ Node<T> *slow = head, *fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (slow == fast) { break; } } if (fast == NULL || fast->next == NULL) { return NULL; } fast = head; while (slow != fast) { slow = slow->next; fast = fast->next; } return fast;}
解法如下:
设定fast和slow两个指针,初始都指向head。然后让fast每次走2步,slow每次走一步,如果发现fast和slow重合,则确定单向链表有环路了。接下来,让fast回到链表的头部,重新走,每次步长不是走2步了,而是走1步,那么当fast和slow再次相遇的结点,就是环路的入口位置了。
证明:
当fast和slow第一次相遇的时候,slow肯定没有遍历完一次链表或刚好遍历完一次链表,而fast已经在环内循环了n圈(n>=1)。这时,假设slow走了i个结点,则fast走了2i个结点,再假设环长为C,则
2i = i + nC -> i = NC
设链表长度为L,链表起点距环入口的距离为j,环入口距相遇点的距离为k,则
j + k = i = nC
j + k = (n - 1)C + C = (n - 1)C + (L - j)
j = (n - 1)C + (L - j - k)
(L - j - k)同k一样,同样为环入口点距相遇点的距离。也就是说,从链表起点到环入口点的距离等于(n - 1)环长+相遇点到入口点的距离。于是,从链表起点、相遇点分别设一指针,每次各走一步,则两指针必定相遇,且第一个相遇点即为环入口点。
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
数据结构 - 如何找到有环单链表的环的入口位置(C++)相关推荐
- 【数据结构与算法】带环单链表查找环的入口算法
带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...
- 求有环单链表的环连接点位置
第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离, 因此,分别从第一次碰撞点Pos.头指针head开始走,相遇的那个点就是连接点. 在环上相遇后,记录第一次相遇点为Pos,连接点 ...
- 【数据结构与算法】判断两个无环单链表是否相交的算法
带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 不过我们这里不考虑带环单链表,且无环单链表相交也只是相交一次,不穿过,这是一种不算复杂的情况吧. ...
- 【数据结构与算法】判断单链表是否有环的算法
带环链表 这里的带环单链表可不是环形单链表,这个环可能是我们不想要的,所以需要检测. 我们就不假设有一个打结状的环了,那样跑到哪里去也不清楚,这里的"带环链表",环必然是在末端. ...
- 数据结构初阶——第三节-- 单链表
链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...
- 证明利用快慢指针寻找有环单链表中环的起点算法
问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.html ...
- 带环单链表求入口节点原理
单链表求环长点击打开链接
- 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)
数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...
- 在单链表的第i个位置后插入一个节点(阿里+腾讯等面试题总结)
时间:2014.04.26 地点:基地 ------------------------- 一.题目 题目是非常easy和基础,就是在单链表的第i个位置后插入一个节点.要求写代码,5分钟之内完毕.面腾 ...
最新文章
- 浅析手机端网站建设的基本流程
- /etc/passwd /etc/shadow 详解
- 推荐几款好用到爆炸的SSH客户端工具
- java例子:数组 数3退1
- hook NSArray 方法在debug模式下会崩溃, 在release模式下会返回nil
- Java实训项目10:GUI学生信息管理系统 - 实现步骤 - 创建数据访问接口实现类
- Go_认识golang
- Canonical发布信息图:Ubuntu Linux连接一切
- 十大排序算法----堆排序(最后一个非叶子节点的序号是n/2-1的推理)
- WPE封包外挂教程(下)
- 广告/友情链接/站内信/会员地址/会员银行卡/我的收藏/评论/搜索/用户标签/用户抬头号/签到/我的足迹/我的优惠卷
- iDo网站在线设计系统的原理
- android qq勋章墙实现,科技教程:如何在手机QQ中进入勋章墙?
- cdr宏教程_cdr软件怎么使用宏批量导出文件?
- 您的自动化测试糟透了
- html页面导出word文档
- php extraxt,php中关于extract方法的使用和建议
- c#中的反射的高级语法_Kubernetes第3部分中的seccomp新语法以及一些高级主题
- java获取当前时间(年月日)
- 敷完面膜后要擦水乳吗_敷完面膜后要擦水乳吗
热门文章
- 区块链经济时代得“先机”者得天下!
- 计算机网络(NETWORK 部分二) 第1-2天
- J-Link驱动下载和JLINK下载Hex程序
- Xcode 添加前缀
- g++使用C++11编译源文件
- opencv6.1-imgproc图像处理模块之平滑与形态学操作
- 清除messages
- IIS 7上安装SQL SERVER 2005报表服务可能导致不能正常连接
- linux kernel rcu 读复制更新 并发控制机制 简介
- spring security oauth rce (cve-2016-4977) 漏洞分析