单链表中环的检测

来源:互联网 发布:固定收益类投资 知乎 编辑:程序博客网 时间:2024/06/05 10:08

利用上一篇文章“单向带环链表的创建”中所讲知识,创建如下带环链表:


检测环的常用方法为快慢指针方法。如果快慢指针相遇,则说明存在环,本文中将返回相遇结点的数值;如果快指针的next为空时,则说明不存在环。本文中慢指针一次移动一个结点,快指针一次移动2个结点。

(1)

//带环链表的检测  快慢指针pNode IsCircle(pNode head){  pNode fast,slow;  fast=slow=head;  if(NULL==head->next)  {    printf("只有一个头结点!");return NULL;  }  else if(NULL==head->next->next)  {   printf("只有2个结点!");   return NULL;  }  else  { fast=fast->next->next;    while((NULL!=slow)&&(NULL!=fast)){  if(fast==slow)  {   return fast;  //返回相遇结点  }  else  {  if(NULL==fast->next)  {    return NULL;   }  slow=slow->next;  fast=fast->next->next;  }}  }}


从上述代码中,我们可以看出,在循环前,让快指针先移动2个结点至第2个结点(数据为10的结点),经过推导,快慢指针是在数据为7的结点相遇。

int _tmain(int argc, _TCHAR* argv[]){type a[9]={11,10,9,8,7,6,5,4,2};pNode p=CreateList_Circle(a,9,3);pNode temp=IsCircle(p);if(NULL!=temp){printf("存在环,相遇结点数据为%d",temp->data);}else{printf("不存在环!");}return 0;}


程序结果为:


(2)上述方法相当于快指针比慢指针快上2步。如果快慢指针同时出发,则代码如下:

//带环链表的检测2  快慢指针pNode IsCircle1(pNode head){  pNode fast,slow;  fast=slow=head;  bool flag =false;  if(NULL==head->next)  {    printf("只有一个头结点!");return NULL;  }  else if(NULL==head->next->next)  {   printf("只有2个结点!");   return NULL;  }  else  {while((NULL!=fast)&&(NULL!=fast->next)){  slow=slow->next;   fast=fast->next->next;  if(fast==slow)  {   flag=true;  //返回相遇结点break;  } }  }  if(true==flag)  {    return fast;  }  else  {   return NULL;  }}


则运行结果为:


相遇点是不同的。

0 0
原创粉丝点击