【C++】链表回环检测
//链表回环检测问题 #include<iostream> #include<cstdlib> using namespace std; const int M=1024; 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=0; while(p) { for(int j=0;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=1;i<=5;i++) { node *t=new node; t->data=i*2; if(i==2) 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=1;i<=5;i++) { node *t=new node; t->data=i*2; p->next=t; p=p->next; p->next=NULL; } /* p=test2->next; while(p) { cout<<p->data<<endl; p=p->next; } */ for(int i=0;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 0; }
tz@HZAU
2019/3/14