Leetcode 203. 移除链表元素

文章讨论了如何在C++中删除链表中所有满足特定值的节点,同时提到了C++中空指针nullptr的使用以及在处理链表时遇到的运行时错误,强调了判断条件顺序对避免undefinedbehavior的重要性。
摘要由CSDN通过智能技术生成

题目简介:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 

本人代码:
 

/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* cur;
        ListNode* pre;
        if(head == nullptr){
            return head;
        }
        while(head != nullptr  &&  head->val == val){
            head = head->next;
        }
        if(head == nullptr || head->next == nullptr){
            return head;
        }
        cur = head->next;
        pre = head;
        while(cur != nullptr){
            if(cur->val == val){
                pre->next = cur->next;
                cur = pre->next;
            }else{
                pre = cur;
                cur = cur->next;
            }
        }
        return head;
    }
};

简单总结一下在C++中Null和nullptr的区别:用Null表示空指针是C语言中遗留下来的传统,但在C++中可能会引起问题,因此在C++11中引入了nullptr表示空指针,如果要在C++中表示空指针,那么使用nullptr而不是Null.。

由于考研中有数据结构,所以这些题目对我来说产生思路都很迅速。但408毕竟是手写代码,现在转到机试上确实有很多新的东西需要考虑。

例如这道题目中我一直报一个错:Char 21: runtime error: member access within null pointer of type 'ListNode' (solution.cpp) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:28:21

这段代码的逻辑上是没有问题的,但是为什么会出现错误呢?这里我想感叹一下C++判断条件的严谨性,这让我这个手写了半年代码的408考生不得不折服。报错原因就在于:
 

while(head != nullptr  &&  head->val == val){
            head = head->next;
        }

若这两个条件前后位置颠倒了,则会可能去head中找val,但head是空的,此时先考虑head是否为空明显会更加严谨一些。

这个错误我看了又有10分钟,在CSDN和google上查了一下最终解决了。

贴一下别人的帖子吧:

http://t.csdnimg.cn/iZFpv

http://t.csdnimg.cn/XDgwn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值