码迷,mamicode.com
首页 > 其他好文 > 详细

怎样才能检测到链表中存在循环?

时间:2015-03-12 11:00:42      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

这是《C专家编程》里面的题目。书中给这个题目加了几个限制。

第三个限制:内存空间非常有限,无法创建一个足够长的数组。但是假定如果链表存在循环,它出现在前N个元素中。

题目分析:可以用两层循环来做。对每一个元素,搜索其后元素直到第N个。指针为Null代表没有环。

简单代码如下:

 1 struct List{  
 2     int data;  
 3     struct List *next;  
 4 };  
 5 bool HasCircle(struct List *head,int N)  
 6 {  
 7     struct List *cur1 = head;  //
 8     if(head->next != NULL)
 9         struct List *cur2 = head->next;  //
10     else
11         return false;
12     int postion1 = 0,postion2 = 1;
13     while(cur1){    
14           
15         if(postion1 > N)
16             return false;
17         while(cur2){  
18             
19             if(postion2 > N)
20                 break;
21             if(cur2 == cur1)
22                 return true; //has circle  
23             cur2 = cur2->next;  
24             postion2++;
25         }
26         cur1 = cur1->next;  
27         postion1++;
28     }  
29     return false;  
30 }  

 

第四个限制:链表的长度是任意的,而且循环可能出现在任何位置。

题目分析:根据书中说的,用一个快指针(每次走两步)一个慢指针(每次走一步),如果两个指针相遇,说明有环。

这个理论可以简单的证明一下:假如在某一时刻慢指针走到了环的位置,此时快指针肯定早已经在环里跑了好久了。这时如果快指针与慢指针相距M步的距离,因为快指针比慢指针每次多走一步,那么在M步之后,快指针将会和慢指针相遇。

 

怎样才能检测到链表中存在循环?

标签:

原文地址:http://www.cnblogs.com/aiqin/p/4331570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!