Loading

如何判断单链表有环

 
分三种情况
1.尾节点指向null(链表无环)
2.尾节点指向头结点
2.尾结点指向非头结点
思路
设置两个指针,a跑的快,b跑的慢,如果链表有环,那么当程序执行到某一状态时,a==b。如果链表没有环,程序会执行到a==NULL,结束。
 1  listnode slow=head;// //链表第一个节点
 2  listnode fast=head.next; //链表第二个节点
 3 while(fast)//当跑的快的节点不为空,继续判断
 4 {
 5     if(fast==slow)//情况2,3
 6     {
 7        System.out.println("有环");
 8         return 0;
 9     }
10     else
11     {
12         fast=fast.next;
13         if(!fast)//情况1,最后一个节点的后继节点为null
14         {
15           System.out.println("无环");
16             return 0;
17         }
18         else
19         {
20             fast=fast.next;
21             slow=slow.next;
22         }
23     }
24 }
25 System.out.println("无环");
26 return 0;

 

复杂度分析

链表长度为n,环节点个数为m

则循环 t=n-m 次时,slow进入环中,此时,我们假设fast与slow相距x个节点,那么,经过t'次循环,二者相遇时,有:
2t'=t'+(m-x) -> t'=m-x -> t'<=m.
因此,总共循环了T=t+t' <= n. 算法复杂度为O(n).

posted @ 2020-10-18 11:06  itjone  阅读(116)  评论(0)    收藏  举报