讨论/技术交流/lc203帮忙看一下为什么过不了/
lc203帮忙看一下为什么过不了
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode dummy(-1);
        ListNode* p = &dummy;
        p->next = head;
        while(p->next){
            if(p->next->val == val)
                p->next = p->next->next;
            p = p->next;     
        }
        return dummy.next;
    }
}

203. 移除链表元素

共 6 个回复

嗯嗯

好的,谢谢!delete!

先要谢谢你了。
看了你的讲解,我有考虑了一下是p = p->next这句话的位置没有考虑好,应该放在if-else的else分支中,而不是if判断后还要执行。所以条件满足的时候,修改p的下一个节点但是不移动p,使其进入下一个循环再次判断新的next的val;条件不满足的时候,只需要移动p就可以了。那么这样仅需要while的条件是p->next。

你找到一个需要删除的节点 p->next 之后,
p->next = p->next->next, 更新了next节点来达到删除原本的p->next的目的
然后 p = p->next, 即为p 变成了原本的 p->next->next

那么如果原list中最后一个节点为需要删除的节点
那么在删除时
p 为倒数第二个节点
p->next 为最后一个节点
p->next->nextnullptr

在进行完删除过程后, p 更新为nullptr, 并进入下一层循环,在while 的条件中检查 p->next, 而pnullptr,无法进行成员访问操作,抛出空指针异常, 应该改为 while(p && p->next)

    考虑这样一个testcase:‘’‘head->val = 5, head->next = nullptr, target val = 5’‘’

    你在进入第一次while之后执行完if里面的删除语句,然后将p->next 置为nullptr,完了你没有退出while循环,接下去执行p =p->next,此时p为nullptr,再进入while条件判断,就会试图访问空指针数据域,那肯定错了。

    建议是在if内加一个break跳出循环,然后这种题记得删除之前把删除掉的节点delete掉,同时dummy head也要delete否则内存泄漏。

我不太懂 C++,但是我执行了一下,看输出是空指针异常。

image.png

你可以比对 题解 把代码写对。