使用双指针,如果链表中有环,那么一定没有指向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; } };