链表(双端链表) list
@[toc]
---
## list 的定义
**链表(双端链表)list**:
<img src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20220609160817.png" style="zoom:50%;" />
**链表节点 listNode**:
<img src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20220609160856.png" style="zoom:50%;" />
只用 listNode 也能实现链表,不过 list 添加首尾指针和链表长度属性,能够在 O(1) 复杂度获取链表的最后一个节点以及链表长度
## Redis 链表的特点
- 双端:链表节点带有表头指针和表尾指针,获取某个节点的前置节点和后置节点的复杂度都是 O(1)
- 带链表长度计数器 len:程序获取链表中节点数量的复杂度为 O(1)
- 无环:表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL,对链表的访问以 NULL 为终点
<img src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20220609161059.png" style="zoom:67%;" />
- 多态:链表节点使用 `void*` 指针来保存节点值,并且可以通过 list 结构的 dup、free、match 三个属性为节点值设置类型特定函数,所以<u>链表可以用于保存各种不同类型的值</u>
