文章目录
前言
本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。
一、题目
1、原题链接
2、题目描述
二、解题报告
1、思路分析
- 为了方便统一插入、删除操作等,使用虚拟头节点来统一操作。
- 各种操作具体思路
- 获取第n个节点的值 :遍历找到第n个节点,获取该节点的
val值进行返回即可。 - 头部插入节点:将新节点指向原链表的头节点,再将虚拟头节点指向新节点。
- 尾部插入节点 :找到尾部节点,将尾部节点的
next指向新节点。 - 第n个节点前插入:找到第n个节点的前一个节点(第n-1个节点),将新节点指向第n个节点,将第n-1个节点指向新节点。
- 删除第n个节点:找到第n-1个节点,将第n-1个节点的
next直接指向第n+1个节点,然后释放原来第n个节点的内存即可。
2、代码详解
cpp
class MyLinkedList {
public:
// 链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int val): val(val), next(nullptr) {} //构造函数
};
MyLinkedList() {
fakehead = new ListNode(0);
list_len = 0; // 链表长度,即节点数
}
int get(int index) {
// 异常情况处理:index为0为第一个节点
// index合法区间为:[0, list_len - 1]
if(index > (list_len - 1)|| index < 0) {
return -1;
}
ListNode* cur = fakehead->next;
while(index--) {
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
ListNode* node = new ListNode(val);
node->next = fakehead->next;
fakehead->next = node;
list_len++;
}
void addAtTail(int val) {
ListNode* node = new ListNode(val);
ListNode* cur = fakehead;
while(cur->next != NULL) {
cur = cur->next;
}
cur->next = node;
list_len++;
}
void addAtIndex(int index, int val) {
// index合法区间为[0, list_len]
if (index > list_len || index < 0) {
return ;
}
ListNode* node = new ListNode(val);
ListNode* cur = fakehead;
while(index--) { // 寻找第index - 1个节点
cur = cur->next;
}
// 插入节点的操作
node->next = cur->next;
cur->next = node;
list_len++;
}
void deleteAtIndex(int index) {
// index合法区间:[0, list_len - 1]
if (index > (list_len - 1)|| index < 0) {
return ;
}
ListNode* cur = fakehead;
while(index--) { // 寻找第index - 1个节点
cur = cur->next;
}
// 删除操作
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
list_len--;
}
private:
int list_len; // 链表长度
ListNode* fakehead; // 虚拟头节点
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
三、知识风暴
- 链表具体操作并不难,重点是注意题目要求中的
index,以及一些特殊情况、边界条件的判断和把控。 - 同时注意
struct结构体定义后需要有;。

