bool hasCycle(struct ListNode *head) {
struct ListNode *fast=head;
struct ListNode *slow=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
//快慢指针相遇了说明有环
if(slow==fast)
{
return true;
}
}
return false;
}
第二道题是第一道题的进阶
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
ListNode *fast=head;
ListNode *slow=head;
ListNode *cur=head;
//里面有fast->next->mext,判断条件加上fast->next,不能为NULL
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
break;
}
}
//有可能传进来NULL,一个节点
//也有可能没有环
if(fast==NULL||slow!=fast||fast->next==NULL)
{
return NULL;
}
ListNode* meet=fast;
//相遇点就是入环的第一个节点
while(head!=meet)
{
head=head->next;
meet=meet->next;
}
return head;
}