今天在LeetCode上写一道链表的环检测简单题(题号:141)时,在网站上编译时出现了如标题所述的error!
主要是因为我忽略了一个重要且容易给轻视的小知识点!
那就是C++中 &&符号 和 ||符号的短路求值效应的属性问题。
我在leetCode上写的error代码:
class Solution {
public:
bool findSameElem(const vector<int>& vec,int val)
{
for(int i=0;i < vec.size();i++){
if(vec[i] == val){
return true;
}
}
return false;
}
bool hasCycle(ListNode *head) {
//来一个vector记录每一个Node的val
vector<int> vec;
ListNode* tempNode = head;
while(tempNode->next != nullptr && tempNode != nullptr){
if(findSameElem(vec,tempNode->val))
{
return true;//has Cycle
}
vec.push_back(tempNode->val);
tempNode = tempNode->next;
}
return false;
}
};
请注意!在while循环中的 while(tempNode->next != nullptr && tempNode != nullptr)
这呃两条蓝色的判断语句中,对于&&符号而言,只要左表达式为false,那么右表达式则不会执行即可直接把while(中的整体表达式赋值为false了)。
类似的,对于||符号而言,(A || B)只要A表达式为true,那么右边的B表达式无论如何,都不会继续执行,直接让(中的整体表达式赋值为true了)
以后再遇到&&和||符号的判断,应注意判断顺序!
因此,这里因为若tempNode->next 已经==nullptr了, 那么就相当于你提前引用了ListNode的一个空指针,这是error的!
以后的coding中若再遇到这种case一定要想到这一个点!!!
参考: