/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode * Judge_Loop(struct ListNode *pHead) //判断链表是否有环的函数,如果没有,则返回NULL,如果有,则返回相遇的节点
{
if(!pHead)
return NULL;
struct ListNode*fast,*slow;
fast = slow = pHead;
while(slow && fast)
{
slow = slow->next;
if(!fast->next)
return NULL;
fast = fast->next->next;
if(fast == slow)
return fast;
}
return NULL;
}
struct ListNode* EntryNodeOfLoop(struct ListNode* pHead ) {
if(!Judge_Loop(pHead)) //如果链表没有环,则直接返回NULL
return NULL;
struct ListNode* index1 = pHead; //令index1指向表头
struct ListNode* index2 = Judge_Loop(pHead); //令index2指向相遇节点
while(1)
{
if(index1 == index2) //当index1和index2再次相遇时,相遇位置即为环的入口
return index1;
index1 = index1->next; //index1,index2每次下滑一个位置
index2 = index2->next;
}
}