思路

用快慢指针的方式,每次让快指针走两步,慢指针走一步。如果快慢指针能相遇则说明链表有环。(因为快慢指针之间的相对距离一直在减小,如果有环快指针早晚可以追上慢指针)

代码实现

/**
 * 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) {
        if(!head) return false;
        ListNode *fast = head;
        ListNode *slow = head;
        while(fast)
        {	
          	//由于快指针一次走两步,所以也要判断fase->next为空
        	if(fast->next==nullptr) return false;
        	fast = fast->next->next;
        	slow = slow->next;
        	if(fast==slow) return true;
        }
        return false;
    }
};