快慢指针,用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步; 当p2 指针追上 p1的时候,就表明链表当中有环路了。
功能函数
int testLinkRing(linkp head) //head为链表头结点
{
linkp t1=head, t2=head;
while( t1->next && t2->next)
{
t1 = t1->next; //t1走一步
if (NULL == (t2 = t2->next->next)) //t2走两步
return 0; //无环
if (t1 == t2)
return 1;
}
return 0;
}
测试代码
#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
struct link *front;
struct link *next;
}linkn, *linkp;
linkp create(void)
{
linkp node = malloc(sizeof(linkn));
node->next = NULL;
return node;
}
int testLinkRing(linkp head)
{
linkp t1=head, t2=head;
while( t1->next && t2->next)
{
t1 = t1->next;
if (NULL == (t2 = t2->next->next))
return 0; //无环
if (t1 == t2)
return 1;
}
return 0;
}
int destory(linkp head) //回收
{
//释放所有的结点
linkp lp = head->next;
linkp tmp = NULL;
while(head->next != NULL)
{
tmp = lp;
head->next=lp->next;
lp = lp->next;
free(tmp);
}
free(head);
//让主函数的链表头指针指向NULL;
lp = NULL;
head = NULL;
return 0;
}
int main(int argc, char *argv[])
{
linkp head = create();
linkp lp = head;
for(int i = 0; i < 4; i++)
{
lp->next=create();
lp = lp->next;
}
lp->next = head; //连环
int ret = testLinkRing(head);
if(ret = 1)
{
printf("is a ring\n");
}
else
{
printf("is not\n");
}
lp->next=NULL; //解环
ret = testLinkRing(head);
if(ret == 1)
{
printf("is a ring\n");
}
else
{
printf("is not\n");
}
destory(head);
return 0;
测试结果
is a ring
is not