runtime error: member access within null pointer of type 'ListNode' - Clone a linked list

runtime error: member access within null pointer of type 'ListNode' - Clone a linked list

我正在尝试以相反的顺序克隆链表。

    ListNode* cloneList(ListNode* head) {
        ListNode *prev = new ListNode(head->val);
        head = head->next;
        while (head != NULL)
        {
            ListNode *p = new ListNode(head->val, prev);
            head = head->next;
            prev = p;
        }
        return prev;
    }

ListNode的定义如下:

struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

但我收到此运行时错误:'ListNode' 类型的空指针内的成员访问。

我是不是在创建或初始化节点时犯了一些错误?请解释。

克隆方法以 反向 顺序 return 新列表是不常见的,但是没关系,如果这是您的实际要求。

如评论中所述,您显示的代码并未考虑列表为空的可能性(即,当 headnullptr 时),例如:

ListNode* cloneList(ListNode* head) {
    if (!head) return nullptr; // <-- add this
    ...
}

如果 head 不是 nullptr 并且指向一个有效的 ListNode,并且列表是正确的 null-terminated,那么您的代码工作正常。

Online Demo

不过可以简化一点,例如:

ListNode* cloneList(ListNode* head) {
    ListNode *newHead = nullptr;
    while (head) {
        newHead = new ListNode(head->val, newHead);
        head = head->next;
    }
    return newHead; 
}

Online Demo