struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head == NULL) return false;
ListNode* walker = head;
ListNode* runner = head;
while(runner->next != NULL && walker->next != NULL){
walker = walker->next;
runner = runner->next->next;
if(walker == runner) return true;
}
return false;
}
};
我正在练习一个看似非常简单的面试代码。我必须返回一个bool来确定单链表是否有循环。我做了两个指针步行者,它移动了1步和每次迭代移动2步的跑步者。
但是这段代码给了我一个错误:
Line 15: member access within null pointer of type 'struct ListNode'
导致该错误的原因是什么?
答案 0 :(得分:6)
您只需确保runner->next
不为空,但在分配后
runner = runner->next->next;
runner
可以变为空。
答案 1 :(得分:0)
这应该解决它:
bool hasCycle(ListNode *head) {
if(head == NULL || head->next == NULL) { return false; }
struct ListNode * walker = new ListNode(1);
struct ListNode * runner = new ListNode(2);
walker = head;
runner = walker->next;
while(walker != fast){
if(runner == NULL || runner->next == NULL) { return false; }
walker = walker->next;
runner = runner->next->next;
}
return true;
}
答案 2 :(得分:0)
//-如果是从圆形路径开始的环行,那么他们将有100%的机会在某个点相遇,因此在这里,我们采用的是行进一个步数的助行器和行进一个两步运动的助行器。
bool hasCycle(ListNode *head){
if(head == NULL || head->next == NULL)
return false;
struct ListNode *temp = head;
struct ListNode *walker;
struct ListNode *runner;
walker = runner= head;
while(temp ){
walker = walker->next;
runner = runner->next->next;
if(runner == walker) // as soon both get at same address we got return as
true value.
{ return True; }
temp = temp->next;
}
return false;
}
答案 3 :(得分:0)
下面的代码应该可以正常工作。
这是经典的Hare-Tortoise定理,兔子走2步(距离单位),乌龟走1步。
我认为您没有检查导致此错误的 runner->next->next
的无效性
bool hasCycle(ListNode *head)
{
if(head == NULL || head->next == NULL)
{
return false;
}
ListNode* tortoise=new ListNode();
ListNode* hare = new ListNode();
tortoise=head;
hare=tortoise->next;
while(tortoise != hare)
{
if(hare == NULL || hare->next == NULL)
{
return false;
}
tortoise=tortoise->next;
hare=hare->next->next;
}
return true;
}
答案 4 :(得分:0)
排序答案在这里有解释
<块引用>它返回错误,因为 runner=runner->next->next
可以为 NULL
并且您在调节时检查 runner->next!=NULL 以便您
必须在你的代码中做一点改变才能得到你的答案
while 条件检查 runner->next->next!=NULL
并获得正确的
回答。
快乐编码:>)