//判断是否有环
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL||head->next==NULL)return false;
ListNode *fast=head,*slow=head;
while(fast&&fast->next){
fast=fast->next->next;
slow=slow->next;
if(fast==slow)return true;
}
return false;
}
};
快慢指针法(双指针法)
1.【判断是否有环】快指针一次跳两步,满指针一次跳一步,有环就意味着总会相遇,即当slow=fast时意味有环
2.【找出环的入点】当两指针相遇后令fast=head,然后fast和slow都每一次走一步,直到再次相遇,相遇点即为环的入点
3.【求环长】当快慢指针第一次相遇后,再次按快指针两步走,慢指针一步走,直到第二次相遇,此时fast刚刚好比slow多走了一个环的距离,即length(环)=两次相遇slow走过的距离
4.【求单链表长度】2中由fast从头走到入点得到非环长度A,3中得到环长度B,则链表长度=A+B