一个链表中包含环,请找出该链表的环的入口结点。
思路:
第一步,找环中相汇点。分别用slow,fast指向链表头部,slow每次走一步,fast每次走二步,直到slow==fast找到在环中的相汇点。
第二步,找环的入口。接上步,当slow==fast时,fast所经过节点数为2x,slow所经过节点数为x,设环中有n个节点,fast比slow多走一圈有2x=n+x; n=x;可以看出slow实际走了一个环的步数,再让fast指向链表头部,slow位置不变,slow,fast每次走一步直到slow==fast; 此时slow指向环的入口。
ListNode* EntryNodeOfLoop(ListNode* pHead) { if(pHead==NULL||pHead->next==NULL||pHead->next->next==NULL) return NULL; ListNode* slow=pHead; ListNode* fast=pHead; while(slow!=NULL&&fast->next!=NULL) { if(slow->next&&fast->next->next)//快慢指针的移动 { slow=slow->next;//慢指针移动一步 fast=fast->next->next;//快指针移动两步 if(slow==fast)//如果快慢指针相遇,让慢指针不动,快指针指向指针头部 { fast=pHead; while(fast!=slow)//快慢指针一起向后移动一步,直至相遇即为环入口节点 { slow=slow->next; fast=fast->next; } return slow; } } else { return NULL; } } return NULL; }
时间: 2024-10-04 11:11:33