#include<iostream>
#include<list>
using namespace std;
class MyLinkedList {
public:
// 定义链表节点结构体
struct LinkedNode
{
int val;
LinkedNode* next;
LinkedNode(int val) : val(val), next(nullptr) {}
};
// 初始化链表
MyLinkedList() {
_dummyHead = new LinkedNode(0); // 定义虚拟头结点
_size = 0;
}
// 获取第index个节点的数值,若不存在则返回-1
int get(int index) { //index从0开始,到size-1
if (index<0 || index > (_size-1)) {
return -1;
}
LinkedNode* cur = _dummyHead->next;
while (index--) {
cur = cur->next;
}
return cur->val;
}
// 在链表头部插入一个节点当做头节点
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
_size++; // !!!!!!!!!!!!!切记size要加1
}
// 在链表尾部添加一个节点
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while (cur->next != nullptr) {
cur = cur->next;
}
cur->next = newNode;
_size++; //!!!!!!!!!!!!!!又忘了加了md
}
// 在index前插入一个新节点,如index=0,则在链表头部插入,新节点为链表的头结点;
// 若index等于链表长度,则在链表尾部插入;
// 若index大于链表长度,则返回空
// 若index小0,则在头部插入节点
void addAtIndex(int index, int val) {
// 若index大于长度,则返回空
if (index > _size) return;
LinkedNode* newNode = new LinkedNode(val);
// 若小于0,则认为是0
if (index < 0) index = 0;
// 插入
LinkedNode* cur = _dummyHead;
while (index--) {
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
// 删除第index个节点,index从0开始,到n-1
void deleteAtIndex(int index) {
// 如果index不在范围内的话
if (index<0 || index > _size - 1) {
return;
}
LinkedNode* cur = _dummyHead;
while (index--) {
cur = cur->next;
}
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
/*使用delete释放tmp所在的内存空间后,tmp为随机值,
即野指针,如果之后不小心用到了tmp这个指针,有可能会指向
未知的空间。
因此要将nullptr赋给tmp*/
tmp = nullptr;
_size--;
}
// 打印链表
void printLinkedList() {
LinkedNode* cur = _dummyHead;
while (cur->next != nullptr) {
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int _size; // 长度
LinkedNode* _dummyHead; // 虚拟头结点
};
注意增加或者删除元素时,要变动_size。
在头部以及中间插入值时,用到了tmp。
但是delete tmp确报错,不知道为什么。
报的错为:20==ERROR: AddressSanitizer: heap-use-after-free on address