题目描述
思路分析
初始,让快慢指针均指向head,即都在原点待跑。然后有如下两种可能:
- 链表有环,则不管快慢指针怎么走,其next都不会为NULL
- 链表无环,则快指针肯定先走到NULL
根据以上分析,只需要将while的循环条件定位while(fast && fast->next)即可,这样,即覆盖到了slow->next的情况,又保证快指针每次可以走两步。
算法实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
// 原点待命
ListNode* fast = head, *slow = head;
// 保证fast可以走2步,如果走不了2步,说明走到头了,没有环,要判定能走2步,先要判定fast不为NULL,不然就没有
// 后续的fast->next了,因为fast是上一步的fast->next->next的来的,是有可能为NULL的
while(fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) { // 因为速度不一致,如果相等,只能是快指针在环里走了一段
return true;
}
}
return false;
}
};