链表和数组区别
数组是连续的,链表是杂乱排列的,通过链表内部结构去指向下一个节点。
题目:203. 移除链表元素 - 力扣(LeetCode)
报错:runtime error: member access within null pointer of type ‘ListNode’ (solution.cpp)
报错原因:试图操作空指针,因为没有判断当前的链表为空就对其内的成员进行了操作
由于链表基础了解的也不深刻,这道题上来还是比较蒙圈的,不知道如何下手,写了一半就去看视频和代码随想录了。看完之后自己把两种方法都写了一边,这里边需要注意的点就是要考虑临界条件,cur 还是 cur->next != NULL。个人感觉还是容易钻如想把所有情况都考虑明白的牛角尖,其实很多时候边界条件考虑好了之后其他的都是ok的。
题目:206. 反转链表 - 力扣(LeetCode)
这道题自己是按自己的思路写了代码出来,AC通过了。
然后看了一下代码随想录的视频,双指针和递归算法很简便很巧妙。不过还是要搞清楚边界条件和递归时谁是cur 谁是pre。
题目:707. 设计链表 - 力扣(LeetCode)
这道题还是很难得,首先定义类自己就很吃力,然后考虑各种链表情况也很麻烦。看完视频之后自己把代码敲一遍,先有个印象,以后有机会再慢慢深入掌握。class:C++类(Class)的定义与实现_c++ class-CSDN博客
class MyLinkedList {
public:
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) {}
};
MyLinkedList() {
dummynode = new ListNode();
_size = 0;
}
int get(int index) {
if(index < 0 || index > _size - 1) {
return -1;
}
ListNode* cur = dummynode->next;
while(index) {
cur = cur->next;
index--;
}
return cur->val;
}
void addAtHead(int val) {
ListNode* cur = dummynode;
ListNode* newnode = new ListNode(val);
newnode->next = cur->next;
cur->next = newnode;
_size++;
}
void addAtTail(int val) {
ListNode* newnode = new ListNode(val);
ListNode* cur = dummynode;
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;
ListNode* newnode = new ListNode(val);
ListNode* cur = dummynode;
while(index--) {
cur = cur->next;
}
newnode->next = cur->next;
cur->next = newnode;
_size++;
}
void deleteAtIndex(int index) {
if(index < 0 || index >= _size) return;
ListNode* cur = dummynode;
while(index--) {
cur = cur->next;
}
cur->next = cur->next->next;
_size--;
}
private:
int _size;
ListNode* dummynode;
};