一开始没有考虑到快指针会越界,后面快指针第二步加了个if判断;
然后是一开始指向同个节点,不应该在循环里判断不相等继续循环,应该作为终止条件;
原版:
class Solution {
public:
bool hasCycle(ListNode *head) {
// if (head == nullptr || head->next == nullptr) {
// 注意:!!!单个节点也可以成环,原先考虑不周但是测试都过了。。。
if (head == nullptr) {
return false;
}
ListNode *fast = head, *slow = head;
while (fast && slow) { // 这里的slow判断其实多余了,无环时一定是fast先到
fast = fast->next;
if (fast) // 这里防止fast为空导致越界访问
fast = fast->next;
slow = slow->next;
if (fast == slow) // 有环退出循环,其实可以直接返回
break;
}
return fast == slow; // 有环相等为true
}
};
官方版本(更好)
class Solution {
public:
bool hasCycle(ListNode *head) {
// if (head == nullptr || head->next == nullptr) {
// 同上
if (head == nullptr) {
return false;
}
ListNode *fast = head, *slow = head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
return true;
}
return false;
}
};