/*
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了,那么就是没有环。