//此题采用快慢指针法
ListNode *detectCycle(ListNode *head)
{
int tag=0;
ListNode *p1,*p2,*pre;
if(head==NULL)//因为下面用到了head->next和head->next->next所以防止空指针必须先判断 ,不然会报空指针错
return NULL;
p1=head->next;
if(p1==NULL)//因为下面用到了p1->next->next所以防止空指针必须先判断
return NULL;
p2=head->next->next;
if(p2==NULL)
return NULL;
while(p1!=NULL&&p2!=NULL)//如果有环,会相遇,不然慢指针永远追不上快的
{
if(p1==p2)
{
tag=1;
break;
}
p1=p1->next;
if(p2->next==NULL)
return NULL;
p2=p2->next->next;
}
if(tag)//相遇出继续往前移动,头指针处继续往前移动,最后他们会在第一个入环节点处相遇
{
pre=head;
while(pre!=p2)
{
pre=pre->next;
p2=p2->next;
}
return pre;
}
return NULL;
}
讲解:
设入环点为A,快慢指针相遇处为B,到A处走了a,A到B走了b
因为快指针速度是慢的两倍,所以慢指针走到B时,快的以及走了2(a+b)了
AB长度以知,快指针减去b再减去a+b就可以得出环的长度时a
所以重新定义一个pre指向head,开始一步一步出发,快指针也一步一步向前走,最后相遇处就是入环点
LeetCode报错:runtime error: member access within null pointer of type ‘struct ListNode’
错误原因:试图使用空指针
解决方法:增加判断条件,并且判断的顺序不能改变。排除对空指针的引用。
比如上文中用到了p2->next->next,就必须先判断p2和p2->next是不是空指针,不然会空指针报错