题目简介:给你一个链表的头节点 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上查了一下最终解决了。
贴一下别人的帖子吧: