数据结构 - 如何找到有环单链表的环的入口位置(C++)
来源:互联网 发布:水浒传李师师 知乎 编辑:程序博客网 时间:2024/05/22 05:29
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)环长+相遇点到入口点的距离。于是,从链表起点、相遇点分别设一指针,每次各走一步,则两指针必定相遇,且第一个相遇点即为环入口点。
- 数据结构 - 如何找到有环单链表的环的入口位置(C++)
- 【链表】若单链表存在环,如何找到环的入口点。
- Java:倘若一个链表有环,如何找到环的入口
- 万事开头难,如何找到程序的入口?
- 如何找到Tomcat启动时的入口文件
- 如何找到带环链表的入口节点?
- C#调用C语言生成的DLL“未找到入口”
- 找到eclipse的入口了
- 基于位置的服务之如何找到自己的位置
- 基于位置的服务之如何找到自己的位置
- 判断单链表中是否有环,找到环的入口节点
- 判断单链表中是否有环,找到环的入口节点
- 判断单链表中是否有环,找到环的入口节点
- 判断单链表有环,存在的话找到环的入口
- 关于链表中是否带环和找到环的入口点
- 关于链表中是否带环和找到环的入口点
- 总算也找到了jetty的入口
- 找到循环链表的入口节点
- 非虚函数在基类和子类中都存在时,调用情况分析
- 和菜鸟一起学OK6410之Led字符驱动
- 京东商城技术架构:前端.NET后端Java
- [转贴]深山红叶使用图文教程
- C++ windows编程学习笔记(一)——程序结构的解析
- 数据结构 - 如何找到有环单链表的环的入口位置(C++)
- centos 防火墙关闭
- java操作mongodb
- 三星uboot1.1.6源码分析——start.s(9)--C语言部分(3)
- RabbitMQ vs Apache ActiveMQ vs Apache qpid
- qpid集群配置
- centos 快捷键
- centos 快捷键设置
- 如何安装执行 qpid tools