环形链表[LeetCode-141]

129 阅读1分钟

题目描述

思路分析

初始,让快慢指针均指向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;
    }
};