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

京公网安备 11010502036488号