数学逻辑:
设:
起始点到循环的入口结点的距离为l
循环的入口节点到相遇点的距离为r
循环的一圈的长度为s
此时假定快结点比慢结点每次多走一个单位长度(很重要)
接下来推导过程如下图所示:
代码实现:
LNode *Fun(LinkList &l) {
//设置快慢两个结点,快结点每次比慢结点多走一个单位长度
LNode *fast = l;
LNode *slow = l;
//找相遇点,这里的循环判断语句是为了保证两个指针都不为空,fast->next != NULL保证了fast =
//fast->next->next;的正确性
while (fast != NULL && fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
}
//判断该链表是否是循环链表
if (fast == NULL || fast->next != NULL) {
printf("该链表不是循环链表\n");
return NULL;
}
//找循环的入口节点,这里的逻辑就是上图推导的数学逻辑的代码实现
//头结点到循环的入口的距离与从入口开始循环n遍环的长度减去入口第一次到相遇节点的长度的距离相等
LNode *p_1 = l;
LNode *p_2 = slow;
while (p_1 != p_2) {
p_1 = p_1->next;
p_2 = p_2->next;
}
return p_1;
}