这里使用了快慢指针,快指针比慢指针多走一步,等它俩相遇后,根据数学公式可以表示出,快指针走的是慢指针走的加上n圈环,所以确定有环后,让慢指针回到最初位置,然后快慢指针都走一步,等相遇后,那个点就是环切点
ListNode* CycleBegin(LinkList* plist)
{
assert(plist != nullptr);
ListNode* slow = plist->head->next;
ListNode* fast = plist->head->next->next;
while (slow != fast)
{
if (fast == NULL || fast->next == NULL)
{
return NULL;
}
slow = slow->next;
fast = fast->next->next;
}
/*while (slow != fast)
{
slow = slow->next;
fast = fast->next;
if (fast->next == NULL)
{
return NULL;
}
fast = fast->next;
}*/
slow = plist->head->next;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}