题目大意:
给定一个链表,判断链表中是否有环。
报错代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL){
return false;
}
ListNode* tmp1 = head;
ListNode* tmp2 = head;
while(tmp1->next != NULL && tmp2->next->next != NULL){
tmp1 = tmp1 -> next ;
tmp2 = tmp2 -> next -> next;
if(tmp1->val == tmp2 -> val){
return true;
}
}
return false;
}
};
错误信息:
Line 17: member access within null pointer of type 'struct ListNode'
原因:
我们在while
循环中判断了tmp1->next
和tmp2->next->next
这两个指针是否为空,但是在判断tmp1->next
的时候,编译器不知道tmp1
是否为空,在判断tmp2->next->next
的时候,编译器不知道tmp2->next
和tmp2
是否为空,因为编译器无法确定,所以报错。
解决方法:
在while
循环中将编译器不知道的指针也进行判断,也就是说,将条件写全一点就OK了。
AC代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL){
return false;
}
ListNode* tmp1 = head;
ListNode* tmp2 = head;
while(tmp1 != NULL && tmp2 != NULL && tmp1->next != NULL && tmp2->next != NULL && tmp2->next->next != NULL){
tmp1 = tmp1 -> next ;
tmp2 = tmp2 -> next -> next;
if(tmp1->val == tmp2 -> val){
return true;
}
}
return false;
}
};