定义两个指针,一个每次前进两个节点,一个前进一个,如果慢的能追上快的就有环。就好比跑步,一个跑的快,一个跑的慢,如果跑道是环状的,跑的快就会把跑的慢的扣圈了,如果跑到无环,那么就不会扣圈现象产生,就是这个道理。
#include<iostream>
#include<cstdlib>
const int MaxSize = 101;
using namespace std;
typedef struct ListNode{
int data;
struct ListNode *next;
}ListNode;
int IsLoopList(ListNode *L)
{
ListNode *p1 = L;
ListNode *p2 = L;
if(L->next == NULL) return 0;
while(p2->next != NULL&&p2->next->next != NULL)
{
p2 = p2->next->next;
p1 = p1->next;
if(p1 == p2)
{
return 1;
}
}
return 0;
}
int main()
{
int num;
ListNode *A;
ListNode *r;
ListNode *s;
A = (ListNode*)malloc(sizeof(ListNode));
r = A;
while(cin>>num)
{
s = (ListNode*)malloc(sizeof(ListNode));
s->data = num;
r->next= s;
r = r->next;
}
r->next = NULL;
if(IsLoopList(A) == 1)
cout<<"nimei"<<endl;
return 0;
}