分享一下我老师大神的人工智能教程!零基础,通俗易懂!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++)相关推荐

  1. 【数据结构与算法】带环单链表查找环的入口算法

    带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...

  2. 求有环单链表的环连接点位置

    第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离, 因此,分别从第一次碰撞点Pos.头指针head开始走,相遇的那个点就是连接点. 在环上相遇后,记录第一次相遇点为Pos,连接点 ...

  3. 【数据结构与算法】判断两个无环单链表是否相交的算法

    带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 不过我们这里不考虑带环单链表,且无环单链表相交也只是相交一次,不穿过,这是一种不算复杂的情况吧. ...

  4. 【数据结构与算法】判断单链表是否有环的算法

    带环链表 这里的带环单链表可不是环形单链表,这个环可能是我们不想要的,所以需要检测. 我们就不假设有一个打结状的环了,那样跑到哪里去也不清楚,这里的"带环链表",环必然是在末端. ...

  5. 数据结构初阶——第三节-- 单链表

    链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...

  6. 证明利用快慢指针寻找有环单链表中环的起点算法

    问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.html ...

  7. 带环单链表求入口节点原理

    单链表求环长点击打开链接

  8. 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)

    数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...

  9. 在单链表的第i个位置后插入一个节点(阿里+腾讯等面试题总结)

    时间:2014.04.26 地点:基地 ------------------------- 一.题目 题目是非常easy和基础,就是在单链表的第i个位置后插入一个节点.要求写代码,5分钟之内完毕.面腾 ...

最新文章

  1. 浅析手机端网站建设的基本流程
  2. /etc/passwd /etc/shadow 详解
  3. 推荐几款好用到爆炸的SSH客户端工具
  4. java例子:数组 数3退1
  5. hook NSArray 方法在debug模式下会崩溃, 在release模式下会返回nil
  6. Java实训项目10:GUI学生信息管理系统 - 实现步骤 - 创建数据访问接口实现类
  7. Go_认识golang
  8. Canonical发布信息图:Ubuntu Linux连接一切
  9. 十大排序算法----堆排序(最后一个非叶子节点的序号是n/2-1的推理)
  10. WPE封包外挂教程(下)
  11. 广告/友情链接/站内信/会员地址/会员银行卡/我的收藏/评论/搜索/用户标签/用户抬头号/签到/我的足迹/我的优惠卷
  12. iDo网站在线设计系统的原理
  13. android qq勋章墙实现,科技教程:如何在手机QQ中进入勋章墙?
  14. cdr宏教程_cdr软件怎么使用宏批量导出文件?
  15. 您的自动化测试糟透了
  16. html页面导出word文档
  17. php extraxt,php中关于extract方法的使用和建议
  18. c#中的反射的高级语法_Kubernetes第3部分中的seccomp新语法以及一些高级主题
  19. java获取当前时间(年月日)
  20. 敷完面膜后要擦水乳吗_敷完面膜后要擦水乳吗

热门文章

  1. 区块链经济时代得“先机”者得天下!
  2. 计算机网络(NETWORK 部分二) 第1-2天
  3. J-Link驱动下载和JLINK下载Hex程序
  4. Xcode 添加前缀
  5. g++使用C++11编译源文件
  6. opencv6.1-imgproc图像处理模块之平滑与形态学操作
  7. 清除messages
  8. IIS 7上安装SQL SERVER 2005报表服务可能导致不能正常连接
  9. linux kernel rcu 读复制更新 并发控制机制 简介
  10. spring security oauth rce (cve-2016-4977) 漏洞分析