redis底层数据结构之双向链表(linkedlist)

双向链表(linkedlist)

redis的双向链表(linkedlist)是基于链表的一种数据结构

链表是一种常见的基础数据结构,是一种非顺序存储数据的线性表,在每一个节点里存储了下一个节点的指针

链表充分利用内存实现灵活的内存动态管理,但是失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大

 

1 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;

其中:

head:表头节点

tail:表尾节点

len:包含的节点数量

(*dup)函数:节点值复制函数

(*free)函数:节点值释放函数

(*match)函数:节点值比较函数,比较是否相等

 

2 listNode(链表节点)结构

typedef  struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;  
} listNode;

其中:

prev:前置节点

next:后置节点

value:当前节点的值

 

3 linkedlist结构示意图

拥有4个节点的linkedlist示意图如下:

 

 

4 redis中linkedlist特性

1) 双向: linkedlist的每个节点都包含前置节点和后置节点的指针

2) 无环: 头节点的prev指针和尾节点的next指针都指向 NULL

3) 常数时间复杂度获取linkedlist长度:len属性获取链表长度的时间复杂度为O(1)

 

posted @ 2022-12-17 18:04  junffzhou  阅读(96)  评论(0编辑  收藏  举报