分三种情况
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).