“快慢指针”法
每次:slow 向前走一步:slow = slow→next
fast 每一步向前两步即:fast = fast→next→next(需先判断next是否空,不空再next)
因为 fast 要比 slow 移动的快,如果有环,fast 一定会先进入环,而 slow 后进入环。当两个指针都进入环之后,经过一定步的操作之后二者一定能够在环上相遇,并且此时 slow 还没有绕环一圈
即:若有环,则一定会在 slow 走完第一圈之前相遇fast=slow退出循环;
若无环,则在fast=NULL时退出循环。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
#include <cstddef>
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL||head->next==NULL) return false;
ListNode *fast=head->next->next, *slow=head;//快慢指针
while(fast!=NULL && fast!=slow){
fast = fast->next;
if(fast){
fast = fast->next;
}//快指针一次走两步
slow = slow->next;//慢指针一次走一步
}
if(fast==slow)return true;
else return false;
}
};