//链表回环检测问题
#include<iostream>
#include<cstdlib>
using namespace std;
const int M=; struct node
{
int data;
node *next;
}; node *test1=new node();
node *test2=new node();//1->ring;2->no ring
node* vis[M]; bool test_ring(const node *head)
{
node *p=head->next;
int i=;
while(p)
{
for(int j=;j<i;j++)
{
if(vis[j]==p&&vis[j]!=NULL)
return true;
}
vis[i]=p;
p=p->next;
i++;
//cout<<vis[0]<<endl;
}
return false;
} bool advanced_test(const node *head)
{
node *slow=head->next;
node *fast=slow;
while(fast!=NULL&&fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
{
return true;
}
}
return false;
} int main()
{
node *p=test1;
node *tag;//环切入点
for(int i=;i<=;i++)
{
node *t=new node;
t->data=i*;
if(i==)
tag=t;
p->next=t;
p=p->next;
p->next=NULL;
}
p->next=tag;
/*
p=test1->next;
while(p)
{
cout<<p->data<<endl;
p=p->next;
}
*/
p=test2;
for(int i=;i<=;i++)
{
node *t=new node;
t->data=i*;
p->next=t;
p=p->next;
p->next=NULL;
}
/*
p=test2->next;
while(p)
{
cout<<p->data<<endl;
p=p->next;
}
*/
for(int i=;i<M;i++)
vis[i]=NULL; cout<<"normal test:"<<endl;
if(test_ring(test1))
cout<<"ring!"<<endl;
else
cout<<"no ring!"<<endl;
if(test_ring(test2))
cout<<"ring!"<<endl;
else
cout<<"no ring!"<<endl; cout<<"advanced test:"<<endl;
if(advanced_test(test1))
cout<<"ring!"<<endl;
else
cout<<"no ring!"<<endl;
if(advanced_test(test2))
cout<<"ring!"<<endl;
else
cout<<"no ring!"<<endl; return ;
}
tz@HZAU
2019/3/14