【问题标题】:Runtime Error in Leetcode Linked List QuestionLeetcode 链表问题中的运行时错误
【发布时间】:2022-11-04 14:42:37
【问题描述】:
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *p=head,*q=head,*t=NULL;
        long long  c=0;
        while(p!=0){
            c++;
            p=p->next;
        }
        c=c-n;
        while(q!=NULL && c>0){
            t=q;
            q=q->next;
            c--;
        }
        t->next=q->next;
        delete q;
        return head;
    }
};
Line 26: Char 12: runtime error: member access within null pointer of type 'ListNode' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:35:12

不知道为什么我会出错,因为根据我的想法,目前 t 和 q 都不是 NULL 。所以,我不应该得到这个错误

【问题讨论】:

  • 建议:不要写字母汤。给事物起描述性的名称。
  • 考虑使用堆栈。当您遍历列表时,将指向每个项目的指针添加到堆栈中。然后你需要做的就是弹出n次来找到你需要删除的节点。还值得确保一些混蛋不会给出比列表大的n
  • 在调试器中运行您的代码并输入导致失败的输入集。然后一步一步,直到你看到你不期望的东西。
  • 在打开相同的消毒剂的情况下测试您的代码也是一个好主意。这意味着您需要一个启用了消毒剂的编译器,而在 Windows 上,这通常意味着 clang。
  • 当您尝试从末尾删除第 0 个时会发生什么? godbolt.org/z/MEx7YrhMG

标签: c++ linked-list singly-linked-list


【解决方案1】:

根据我的想法, t 和 q 都不是 NULL

...不是当n 等于列表的大小时,在这种情况下c 将在c=c-n 执行后为0。在这种情况下,第二个循环将不进行任何迭代,使t 等于NULL(顺便说一句,您真的应该在C++ 中使用nullptr)。

在这种边界情况下,您需要删除第一个节点,并返回一个不同的 head 指针。

所以替换:

        t->next=q->next;

        if (t == nullptr) {
            head = q->next;
        } else {
            t->next = q->next;
        }

【讨论】:

    【解决方案2】:

    你分配q = head 然后运行这个循环。

    while(q!=NULL && c>0){
                t=q;
                q=q->next;
                c--;
    }
    

    但是如果headnullptr 会发生什么?那么t 仍然是nullptr

    然后它使这条线崩溃。

    t->next=q->next;
    

    所以,你可以在开头检查head is not nullptr,或者你可以在使用之前检查t is not nullptr。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 2022-12-14
      • 2021-04-07
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多