链表和节点的实现
节点由三部分组成,分别是指向前一个结点的指针和指向后一个节点的指针加上节点存储的值value。
链表的组成是由节点listNode组成的,并且使用的是 adlist.h/list 来操作链表
list的结构有如下:
listNode * head; //链表的头节点
listNode * tall; //链表的尾节点
unsigned long len; //链表节点的个数
void *(*dup)(void *ptr); //节点值复制函数
void (*free) (void *ptr);//节点释放函数
int (*match) (void *ptr,void *key); //节点值对比函数
dup 函数用于复制链表节点所保存的值
free 函数用于释放链表节点所保存的值
match 函数用于对比链表节点和另一个值是否相等
Redis的链表实现特性
- 双端,每个节点都有prev和next两个指针,所以寻找某个节点的前后值都是O(1)
- 无环,头节点的prev和尾节点的next都指向NULL,所以不构成环
- 有头指针和尾指针
- 有记录链表长度的属性len,获取链表长度的时间复杂的为0(1)
- 多态,链表节点使用void* 指针来保存节点值,还可以用dup 、 match 、free函数来设置类型特定函数,所以链表可以保存不同类型的值