给定一个单链表,只给出头指针h:
选定两个指针p1,p2,初始时p1=p2=h,循环执行以下操作p1=p1+1,p2=p2+2,判断p1==p2,若p1==p2,记交点为p,则存在环,否则不存在。(追赶问题)
从p开始执行以下操作p1=p1+1,p2=p2+2,再次相交时,执行的操作数,即为环的长度。(追赶问题)
p点到交点的距离=h到交点的距离。
证明:
设环外链长为s1,环长为s,执行操作的数目为x,则必有
s1+2x-x=ns (n=1,2,3..)
x=ns-s1 (x对应于p点)
x点到交点的距离为s1
证毕
s+s1
code---根据上图构建链表
#include <stdio.h>
#include <stdlib.h>
typedef struct chain
{
int num;
struct chain* next;
}CH,NODE;
NODE* newnode(void)
{
NODE* temp;
temp=(NODE*)malloc(sizeof(NODE));
return temp;
}
NODE* createchain(void)
{
int i;
NODE* temp,*save=NULL,*h,*p;
for(i=1;i<=7;i++)
{
temp=newnode();
temp->num=i;
if(save==NULL)
{
save=temp;
h=save;
}
else
{
save->next=temp;
save=temp;
}
if(i==4)
{
p=save;
}
}
save->next=p;
return h;
}
void checkloop(NODE* h)
{
int len1=0,len2=0;
NODE* p1,*p2;
p1=p2=h;
p1=p1->next;
p2=p2->next->next;
while(p1!=p2)
{
p1=p1->next;
p2=p2->next->next;
}
len1=1;
p1=p1->next;
p2=p2->next->next;
while(p1!=p2)
{
p1=p1->next;
p2=p2->next->next;
len1++;
}
printf("The length of the loop is: %d\n",len1);
p1=h;
while(p1!=p2)
{
len2++;
p1=p1->next;
p2=p2->next;
}
printf("The intersect node is: %d\n",p1->num);
printf("The length of the chain is: %d\n",len1+len2);
}
int main(void)
{
CH* h;
h=createchain();
checkloop(h);
system("pause");
return 0;
}
原文:http://blog.csdn.net/cjc211322/article/details/22688939