使用双指针,如果链表中有环,那么一定没有指向nullptr的节点;设置两个指针,一个指针一次走一步,另一个指针一次走两步,如果链表有环,两个指针一定会相遇。

时间复杂度:o(n)

空间复杂度:o(1)

class Solution {
public:
    bool hasCycle(ListNode *head) {
        //特殊情况处理
        if (head == nullptr)
            return false;
        
        ListNode* pslow = head;
        ListNode* pfast = head;
	    //保证快的指针和它的下一个节点都有效
        while(pfast != nullptr && pfast->next != nullptr) {
            pslow = pslow->next; //走一步
            pfast = pfast->next->next; //走两步
            //如果有环,两个节点一定会相遇
            if (pslow == pfast)
                return true;
        }
        
        return false;
    }
};