redis里拥有一个灵活扩展且获取表头表尾复杂度为O(1)的双端列表,分为list和listNode2部分组成。
list:
typedef struct list {//链表
listNode *head;//链表头
listNode *tail;//链表尾
void *(*dup)(void *ptr); //复制函数指针
void (*free)(void *ptr); //释放内存函数指针
int (*match)(void *ptr, void *key); //比较函数指针
unsigned long len; //链表长度
} list;
listNode:
typedef struct listNode {
struct listNode *prev;//前驱指针
struct listNode *next;//后继指针
void *value; //节点的值
} listNode;
以下是双向链表的实现原理:
list结构存在的意义:
1.获取首元素和尾元素的时间复杂度为O(1),且可以选择向后或向前遍历链表元素
2.获取元素数量时间复杂度为0(1),无需遍历即可快速取出元素数量