目录
- 1 知识点
- 2 模板
1 知识点
一般以指针实现为主,可以预生成N个结构体。
struct ListNode {int val;ListNode *next;
};
但这里以数组模拟为主。
单链表和邻接表。
双链表。
(一)插入操作
链表插入操作的关键步骤,比如在结点a处插入一个新结点b,
- 构建结点b,b的next指针指向a的下一个结点。
- a的next指针指向b。
注意,必须先进行操作1,再进行操作2。
(二)删除操作
删除结点k的后一个结点,
ne[k] = ne[ne[k]]
2 模板
const int N = 1e5 + 10;
int head; //记录头结点的编号。
int idx; //生成所有结点的编号。
int e[N], ne[N]; //e[i]表示结点i的值,ne[i]表示结点i的next结点编号。//(1)初始化链表
void init() {head = -1;idx = 0;
}//(2)在头结点插入数值x
void head_insert(int x) {e[idx] = x, ne[idx] = head, head = idx, idx++;
}//(3)在结点k后插入数值x
void insert(int k, int x) {e[idx] = x, ne[idx] = ne[k], ne[k] = idx, idx++;
}//(4)删除头结点
void head_remove() {head = ne[head];
}//(5)删除结点k后面的结点
void remove() {ne[k] = ne[ne[k]];
}//(6)遍历当前单链表
for (int i = head; i != -1; i = ne[i]) {//i表示结点编号//e[i]为结点的值cout << e[i] << " ";
}