#include <stdbool.h>
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param head ListNode类
* @return bool布尔型
*/
/*********************************************************************
* 判断链表是否有环,是双指针实现,可以比喻为龟兔带跑
* 兔子相当于快指针,兔子跑的快,每次跑2步
* 乌龟相当于慢指针,乌龟跑的慢,每次跑1步
* 如果链表有环,则兔子会先于乌龟进入环,并一直在环内移动
* 等到乌龟进入环时,由于兔子跑的快,则肯定会在某时刻与乌龟相遇,即套了乌龟N圈
***********************************************************************/
bool hasCycle(struct ListNode* head ) {
// write code here
if(head == NULL || head->next == NULL)
return false;
struct ListNode *slow = head;
struct ListNode *fast = head->next;//快指针如果当前如果为head时,while无法实现循环
while(fast != slow)
{
//快指针每次跑2步,所以当前节点和当前的下一个节点为NULL时,说明没环
if(fast == NULL || fast->next == NULL)
return false;
slow = slow->next;
fast = fast->next->next;
}
return true;
}