给定一个单链表,只给出头指针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