链表结点使用一个adlist.h/listNode结构来表示:
typedef struct listNode {
struct listNode *prev; // 前置结点
struct listNode *next; // 后置结点
void *value; // 值
}listNode;
adlist.h/list来持有链表:
typedef struct list{
listNode *head; // 头结点
listNode *tail; // 尾结点
unsigned long len; // 结点数量
void *(*dup)(void *ptr); // 复制函数
void (*free)(void *ptr); // 释放函数
int (*match)(void *ptr,void *key) // 对比函数
}
Redis链表的特性:
1.双端:获取prev结点和next结点的复杂度O(1)
2.无环:头结点prev指针指向NULL,尾结点next指针指向NULL
3.head指针和tail指针:程序获取头结点和尾结点的复杂度为O(1)
4.len属性:获取结点数量的复杂度为O(1)
5.void 可以保存不同类型的值