成员访问类型为' struct ListNode'的空指针。

时间:2017-06-24 07:31:12

标签: c++ data-structures linked-list

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'

导致该错误的原因是什么?

5 个答案:

答案 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 并获得正确的 回答。

快乐编码:>)