Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

这里要求空间复杂度为o(1),那自然是在遍历中,找到这个链表中的环。

思路是怎么出来的呢?如果链表有环,那么就可以无限遍历下去,这时我们把这个环想象成一个操场的跑道,

假设有两个人在跑步,一快一慢,必定会有快的一方追上慢的一方。

这道题的解法就是开两个指针,一快一慢,快的一次走两个节点,慢的一次走一个节点,当快的追上慢的,说明有环,快的走到了NULL,说明无环。

注意点:1.链表为空 2.快指针走两步是否会发生地址异常的情况,所以要在条件中就判断fast->next是否为NULL。

/**
 * 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;
        while(fast!=NULL&&fast->next!=NULL)
        {
            slow = slow->next;
            fast = fast->next->next;
            if(slow==fast)
                return true;
        }
        return false;
    }
};