來自於:http://blog.sina.com.cn/s/blog_5f0d72800100tayr.html
思路:
用兩個指標,pSlow,pFast,就是一個慢一個快
慢的一次跳一步
快的一次跳兩步
往鏈表末端移動。如果pFast==NULL,則說明鏈表沒有環,如果pSlow==pFast,則說明鏈表存在環。 這個方法與前面2個方法相比,不但速度很快,而且不需要額外的儲存空間,時間複雜度、空間複雜度都是最小的。bool IsLoop(node *head)
{
node *pSlow=head;
node *pFast=head;
while(pSlow!=NULL &&pFast!=NULL)
{
pSlow=pSlow->next;
pFast=pFast->next->next;
if(pSlow==pFast)
return true;
} returnfalse;
} 完整的測試代碼如下:#include "iostream"
using namespace std;
struct node
{
int data;
structnode *next;
}*linklist,*s,*head;map<node*,int>m;bool IsLoop(node *head)
{
node *pSlow=head;
node *pFast=head;
while(pSlow!=NULL &&pFast!=NULL)
{
pSlow=pSlow->next;
pFast=pFast->next->next;
if(pSlow==pFast)
returntrue;
}
return false;
}
node* InsertNode(node *head,int value)
{
if(head==NULL)
{
head=(node *)malloc(sizeof(node));
if(head==NULL)
printf("malloc failed");
else
{
head->data=value;
head->next=NULL;
}
}
else
{
node *temp=(node *)malloc(sizeof(node));
if(temp==NULL)