问题:
在做leetcode 707.设计链表时反复遇到如下错误:
runtime error: member access within null pointer of type 'LinkNode'
原代码如下:
class MyLinkedList {
public:
struct LinkNode {
int val;
LinkNode* next;
LinkNode(int val) : val(val), next(nullptr) {}
};
MyLinkedList() {
dummyhead = new LinkNode(0);
size = 0;
}
int get(int index) {
if (index > (size - 1) || index < 0)
return -1;
LinkNode* cur = dummyhead->next;
while (index--) {
cur = cur->next;
}
return cur->val;//在这行总会报错
}
void addAtHead(int val) {
LinkNode* newNode = new LinkNode(val);
newNode = dummyhead->next;
dummyhead->next = newNode;
size++;
}
void addAtTail(int val) {
LinkNode* cur = dummyhead;
LinkNode* newNode = new LinkNode(val);
while (cur->next != nullptr) {
cur = cur->next;
}
cur->next = newNode;
size++;
}
void addAtIndex(int index, int val) {
if (index > size)
return;
if (index < 0)
index = 0;
LinkNode* cur = dummyhead;
LinkNode* newNode = new LinkNode(val);
while (index--) {
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
size++;
}
void deleteAtIndex(int index) {
if (index < 0 || index > size - 1)
return;
LinkNode* cur = dummyhead;
while (index--) {
cur = cur->next;
}
LinkNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
tmp = nullptr;
size--;
}
private:
int size;
LinkNode* dummyhead;
};
解决方法:
在检查后发现在addAtHead函数中对newNode赋值写错了,应改为:
void addAtHead(int val) {
LinkNode* newNode = new LinkNode(val);
newNode->next = dummyhead->next;
dummyhead->next = newNode;
size++;
}
之前错误地把newNode直接赋值了dummyhead->next了。
个人理解:
如果newNode=dummyhead->next,那么链表中第一个元素就会被删除在外,但是与此同时size++了,导致在调用get函数时,index大于实际的size-1,从而去调用空指针了。