判断一个单向链表中是否有环。
我的方法是让一个指针一次走一步,另一个指针一次走两步。让他们在不为空的情况下一直走。如果有环,这两个指针一定会有重合的时候,如果没环,他们迟早会有一个为空。
AC代码:
bool hasCycle(ListNode *head) {
ListNode *one,*two;
one = two = head;
while(one != NULL && two != NULL){
if(one->next != NULL)
one = one->next;
else return false;
if(two->next != NULL){
if(two->next->next != NULL){
two = two->next->next;
}else{
return false;
}
}else return false;
if(one == two)
return true;
}
return false;
}
这道题我遇到的主要的问题是two指针在走的时候,一开始我是
if(two->next->next !=NULL) two = two->next->next;
这样如果two->next就为空的话会出现编译错误。
我又改成
if(two->next->next !=NULL && two->next !=NULL )
two = two->next->next;
但这样还是会在two->next的时候出现指针越界。所以一定要先看next是否为空先。以后要注意这种跳着走的,要一步一步逐步去判断是否为空。