/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* fast=pHead;
ListNode* slow=pHead;
while(fast!=nullptr&&fast->next!=nullptr)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
ListNode* p=fast;
ListNode* q=pHead;
if(p==q)return p;//如果只有一个节点的环,需要直接返回
while(p!=nullptr)
{
p=p->next;
q=q->next;
if(p==q)return q;
}
}
}
return nullptr;
}
};
通过双指针的另一种应用快慢指针,可以轻松解决,定义一个快指针fast,每次跳跃两个节点,定义一个慢指针slow,每次跳跃一个节点,两个指针从同一个位置开始遍历,如果最后两个指针相遇了,就说明该链表有环,如果fast直接等于nullptr了,那么就是没有环。

京公网安备 11010502036488号