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; } };