redis 链表解析
redis 中链表结构如下
redis 的链表为双向链表,每一个链表结点同时具有一个指向前驱和指向其后继节点的指针,多个节点就组成了一个双向链表。
list 结构为链表提供了头指针 head 和尾指针 tail,以及链表长度计数器 len,free 和 match 则用于实现多态链表所需的类型特定函数:
- dup 用于复制节点所保存的值
- free 用于释放节点所保存的值
- match 用于比对节点所保存的值与另一个输入值是否相等
创建链表
创建链表,链表没有节点,头尾指针均指向NULL
从链表头或者链表尾插入新节点
在指定节点处添加新节点
旋转链表,将链表尾节点插入到头部
释放链表
redis 双向链表的特性:
- 链表节点带有 prev 和 next 指针,获取某节点前驱或者后继节点的时间复杂度为 O(1)
- 无环:链表头节点的 prev 指针和尾节点的 next 指针均指向 NULL,即从头遍历或者从尾遍历都是以 NULL 结束链表遍历,不会出现环。
- 头尾指针使得获取链表头尾指针的时间复杂度为 O(1)
- list 的 长度计数器 len,使得获取链表长度的时间复杂度为 O(1)
- 链表结点通过
void*
来保存节点值,可以接受任何类型的数据,同时,free,match 和 dup 三个属性为节点值设置类型特定函数,使得链表可以用于保存各种不同类型的值。