/*
** 检验一个链表中是否存在循环
** 算法:指针追赶
*/
#include <stdio.h>
#include <malloc.h>
#define N 300000
typedef struct list
{
int a;
struct list *pnext;
}L;
int loop_test(L *pl);
//主函数
void main()
{
L *ptemp1, *ptemp2, *phead = NULL;
int i;
for(i = 0; i < N; i++)
{
if(NULL == phead)
{
phead = ptemp1 = ptemp2 = malloc(sizeof(L));
ptemp1->a = 666;
}
else
{
ptemp2 = malloc(sizeof(L));
ptemp2->a = 666;
ptemp1->pnext = ptemp2;
ptemp1 = ptemp2;
}
}
ptemp2->pnext = NULL; //形成循环链表
if(loop_test(phead))
{
printf("loop/n");
}
else
{
printf("no loop/n");
}
}
//循环检验
int loop_test(L *pstart)
{
L *p1, *p2;
if(NULL == pstart->pnext)
return 0;
if(NULL == pstart->pnext->pnext)
return 0;
p1 = pstart;
p2 = p1->pnext->pnext;
while(NULL != p1 && NULL != p2)
{
if(p1 == p2)
return 1;
p1 = p1->pnext;//向后走
if(NULL == p2->pnext || NULL == p2->pnext->pnext)
return 0;
p2 = p2->pnext->pnext; //追p1
}
return 0;
}