ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Floyd龟兔算法

2022-05-28 00:31:38  阅读:167  来源: 互联网

标签:slowPoint fastPoint 龟兔 相遇 next 算法 Floyd head 指针


Floyd龟兔算法

算法描述

Floyd龟兔算法是一种指针算法。该算法仅使用移动速度不同的两个指针就能检测出是否有环。Floyd龟兔算法解决以下问题:
1.检测是否有环。
想象在一个环形跑道上跑步,两个人同时出发,出发以后速度快的人终究会在某一点和速度慢的人相遇。一般这个时候相遇,速度快的人比速度慢的人至少多跑一圈。

2.环的起点节点。
如上图,h表示快指针,t表示慢指针,两者相遇在M点。
令h仍位于节点M,令t返回起始节点S。随后,同时让t和h往前推进,且保持两者速度相同:t前进一步,h前进一步,持续该过程直至t与h再一次相遇,则两者相遇在环的一个起点。
证明:
t走的步数,step = p + m + a * C,a表示相遇时t走的圈数
h走的步数,2 * step = p + m + b * C,b表示相遇时h走的圈数
两者相减:step = (b - a) * C = p + m + a * C,由此可知t走的步数是环C的倍数,即 p + m 刚好是环长度C的倍数。

调整h速度行进后,t走了p步到达P,h从M处出发走了p步,相对于环起始位置,h走过的距离是 m + p,而m + p刚好是环长度C的倍数,即h此时也位于环起始节点处,即t和h在P处相遇。

3.环的长度。
当快慢两指针相遇的时候,令快指针不动、慢指针继续前进,当再次相遇时,所走的步数就是环的长度。

141.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

class Solution {
public:
    bool hasCycle(ListNode *head) {
       if(head == NULL || head->next == NULL)   return false; // 使用指针一定要注意next是否存在
       ListNode * fastPoint = head->next->next;
       ListNode * slowPoint = head->next;
       if(fastPoint == slowPoint)   return true;
       while(fastPoint != NULL && slowPoint != NULL && fastPoint != slowPoint){
           if(fastPoint->next == NULL)   return false; //在使用快慢指针的时候,要注意快指针是否会浮空  即若next == NULL 则 next->next (浮空)
           fastPoint = fastPoint->next->next;  slowPoint = slowPoint->next;
           if(fastPoint == slowPoint)   return true;
       }
       return false;
    }
};

标签:slowPoint,fastPoint,龟兔,相遇,next,算法,Floyd,head,指针
来源: https://www.cnblogs.com/wuqiu/p/16319662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有