搜东西的时候看到的,自己看了看别人的讨论,写了个方法。
基本思想:申明两个临时指针,一个一次走一步,一个一次走两步,看最后是否能够相等,如果有环,肯定会出现相等的情况;没有环,应该能够正常结束。
定义一个结构体:
typedef struct node
{
int info;
struct node* next;
}LINKLIST;
查找方法:
bool findCircle(LINKLIST *begin)
{
if(begin == NULL || begin->next ==NULL)
{
return false;
}
if(begin->next == begin)
{
return true;
}
LINKLIST *first, *second;
first = begin;
second = begin->next->next;
while( first != second && second != NULL && second->next !=NULL)
{
first = first->next;
second = second->next->next;
}
if(first == second)
{
return true;
}
return false;
}
方法有点笨,主要是一个要先走两步,一个后走一步。
最后写个main测试下:
int main()
{
LINKLIST A;
LINKLIST B;
LINKLIST C;
LINKLIST D;
A.info = 1;
B.info = 2;
C.info = 3;
D.info = 4;
LINKLIST* p = NULL;
p = &A;
LINKLIST* q = NULL;
q = &A;
A.next = &B;
B.next = &C;
C.next = &D;
D.next = NULL;
if(findCircle(&A))
{
printf("链表中有环");
}
else
{
printf("链表中没有环");
}
}
这个是没有环的,最后能输出“链表中没有环”;修改D.next = &B,这样会输出“链表中有环”;
csdn上讨论的网址:http://topic.csdn.net/t/20061112/15/5151874.html