当前位置:   article > 正文

单链表:寻找环形链表的入口点_判断环形链表入口

判断环形链表入口

1、在寻找环形链表的入口之前,如何判断链表是环形的?

定义两个指针fast和slow,fast每次走两步,slow每次走一步,如果fast和slow可以相遇,说明链表带环。

2、如何找到环形链表的入口?

如图是一个环形链表。

设a点为链表头结点,b点为环的入口点,c点为fast和slow的第一次相遇点。

设ab长度为x,bc长度为y,z为环的长度。

则fast在相遇前走的距离应该是:x+nz+y(n为fast运动的圈数)。

slow的距离:x+y。

因为fast的速度是slow的二倍;

则有:2(x+y)= x+nz+y

                   x+y = nz

                       x = nz - y

当n为1的时候,x = z - y ,z是环的长度,可知 m = x,正好是第一次相遇点和环的入口点的距离。

此时让一个引用slow或者fast从头结点开始走,另一个引用在第一次相遇点,两个引用同时走,每次走一步,,下次相遇点就是环的入口点。

代码如下:

  1. public ListNode detectCycle(ListNode head) {
  2. ListNode fast = head;
  3. ListNode slow = head;
  4. while(fast !=null && fast.next != null ){
  5. fast = fast.next.next;
  6. slow = slow.next;
  7. if (fast == slow) {
  8. break;
  9. }
  10. }
  11. if (fast == null || fast.next == null) {
  12. return null;
  13. }
  14. slow = head;
  15. while (fast!=slow) {
  16. fast = fast.next;
  17. slow = slow.next;
  18. }
  19. return slow;
  20. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/604760
推荐阅读
相关标签
  

闽ICP备14008679号