链表节点 每个链表节点使用一个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) }list; dup函数用于复制链表节点所保存的值。free 函数用于释放链表节点所保存的值。match函数则用于比较链表节点所保存的值和另一个输入值是否相等。Redis链表实现的特性:
双端:链表节点带有prev 和 next 指针,获去某个节点的前置节点和后置节点的复杂度都是O(1)。无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获去链表表头节点和表尾节点的复杂度为O(1)。带链表长度计数器:list结构的len属性记录链表的节点数,程序获去链表中的节点数量的复杂度为O(1).多态:链表节点使用void*指针来保存节点值,并且通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值