C++ 快慢指针
当单链表存在环时,快慢指针都在头结点出发,快指针每次移动两格,慢指针每次一格,当快慢指针第一次相遇时,快指针回到头结点,并且每次移动一格,最后快慢指针会在环开始结点再次相遇。
单链表有环
ListNode *detectCycle(ListNode *head) {
//返回环开始结点
ListNode *slow = head; //慢指针
ListNode *fast = head; //快指针
if(!head || !head->next) //判断是否有环
return NULL;
while(1){ //第一次相遇
slow = slow->next;
fast = fast->next->next;
if(!fast || !fast->next) //判断是否有环
return NULL;
if(slow == fast)
break;
}
//第二次相遇
fast = head;
while(fast != slow){
slow = slow->next;
fast = fast->next;
}
return slow;
}