链表
一、定义🧀
有头结点的地址就能访问整个链表
-
与数组对比
-
数组 链表 访问 \(O(1)\) \(O(n)\) 内存 固定 无多余 需要足够大的数组长度 多余内存用于储存指针 插入删除 a) 头插-\(O(n)\) a)-\(O(1)\) b)尾插 -\(O(1)\) b)-\(O(n)\) 便捷 ✔️ ❌
二、基本操作(单向链表)🧀
※ 遍历🧀
1、头插🧀
2、中间插入🧀
3、删除🧀
- 修复指针链接(fix the links) 在删除某个节点
node
时,需要修改前驱节点的next
指针(对于单链表)或同时修改前驱和后继指针(对于双向链表),使其绕过该节点,保持链表结构完整。 - 释放内存空间(free the space from memory) 删除节点后,需要调用
delete
(C++)或free
(C)释放该节点占用的内存,防止内存泄漏。
三、反转🧀
1、迭代🧀
Example
2、递归打印🧀
Tip
递归就是自我调用
Example
3、递归反转🧀
四、双向链表🧀
Info
优点 | 缺点 |
---|---|
允许反向遍历(Reverse look-up ) | 每个节点需要额外的指针(prev )来指向前一个节点 |
1、创建🧀
2、头插🧀
3、打印&反转🧀
4、💖库函数list
🧀
函数 | 作用 |
---|---|
push_back(x) | 尾部插入 |
push_front(x) | 头部插入 |
pop_back() | 删除最后一个元素 |
pop_front() | 删除第一个元素 |
insert(it, x) | 在迭代器 it 指向的位置前插入 |
erase(it) | 删除指定位置的元素 |
clear() | 清空链表 |
size() | 返回元素个数 |
empty() | 判断是否为空 |
reverse() | 反转整个链表 |
sort() | 排序(默认升序) |
remove(x) | 删除所有值为 x 的节点 |