思路:定义2个指针pfast和pslow,pfast指针每次走2步,pslow指针每次走1步,如果走的快的指针末了追上走的慢的指针,则链表成环。
设:慢指针走过的路程为s出发点间隔环入口点为a环中相遇点间隔入口点为b(走过的)
2个等式判断环的入口点:1.快指针走的路程是慢指针的2倍。2s = s + nr==>s = nr2.慢指针走过的路程a + b = s

联合1,2:a = nr - b因此,指针1从环内相遇点开始走,指针2从出发点开始走,它们相遇点便是环的入口点。
参考代码:
root@gt:/home/git/Code# ./a.out 0 1 2 3 4 5 6 7 8 9 10 11 12 pfast:2 pslow:1pfast:4 pslow:2pfast:6 pslow:3pfast:8 pslow:4pfast:10 pslow:5pfast:12 pslow:6pfast:11 pslow:7pfast:10 pslow:8pfast:12 pslow:9pfast:11 pslow:10pfast:10 pslow:11pfast:12 pslow:12has:1 meeting node:12enrty node:10root@gt:/home/git/Code# cat ring.c #include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct listNode{ int value; struct listNode pnext;}ListNode;ListNode entryNode(ListNode phead,ListNode pnode){ if(phead == NULL || pnode == NULL) return NULL; while(phead != pnode) { phead = phead->pnext; pnode = pnode->pnext; } return phead;}int hasRing(ListNode phead,ListNode ppnode){ if(phead == NULL) return 0; int ring = 0; ListNode pslow = phead->pnext; ListNode pfast = pslow->pnext; while(pfast != NULL && pslow != NULL) { printf("pfast:%d\tpslow:%d\n",pfast->value,pslow->value); if(pslow == pfast) { ring = 1; ppnode = pslow; break; } pslow = pslow->pnext; pfast = pfast->pnext->pnext; } if(pfast == NULL) ring = 0; return ring;}int main(){ ListNode phead = (ListNode)malloc(sizeof(ListNode)); phead->value = 0; phead->pnext = NULL; ListNode plast = phead; for(unsigned int i = 1;i < 11 ;i++) { ListNode pnew = (ListNode)malloc(sizeof(ListNode)); pnew->value = i; pnew->pnext = NULL; plast->pnext = pnew; plast = pnew; } ListNode pringNode2 = (ListNode)malloc(sizeof(ListNode)); pringNode2->value = 12; pringNode2->pnext = plast; ListNode pringNode1 = (ListNode)malloc(sizeof(ListNode)); pringNode1->value = 11; pringNode1->pnext = pringNode2; plast->pnext = pringNode1; ListNode ptmp = phead; for(int i = 0;i < 13;i++) { printf("%d\t",ptmp->value); ptmp = ptmp->pnext; } printf("\n"); ListNode pnode = NULL; int has = 0; has = hasRing(phead,&pnode); printf("has:%d\tmeeting node:%d\n",has,pnode->value); ListNode pentry = entryNode(phead,pnode); printf("enrty node:%d\n",pentry->value); return 0;}root@gt:/home/git/Code#