经典题型,使用双指针法。一个快指针,一个慢指针,两指针最初都指向头结点,快指针一次走两步,慢指针一次走一步。若存在环,则两个指针最后一定会走到一个结点上。
/**
 * 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;
        ListNode* slow = head;
        if(head == NULL){
            return false;
        }
        if(head->next == NULL){
            return false;
        }
        fast = fast->next->next;
        slow = slow->next;
        while(fast != NULL && slow != NULL){
            if(fast == slow){
                return true;
            }
            slow = slow->next;
            if(fast->next != NULL){
                fast = fast->next->next;
            }else{
                return false;
            }
            
        }
        return false;
    }
};
这里需要注意两个需要特殊处理的情况。一是空链表,直接返回false。二是单结点无环,直接返回false。
还有一点需要注意的是,在编程时容易将第一次移动结点写在循环中,这样容易出错,建议将第一次移动结点在循环外完成。