redis数据结构-双端链表
双端链表的实现由listNode 和list 两个数据结构构成,下图展示了由这两个结构组成的一
个双端链表实例:
typedef struct listNode { //双端链表的节点
// 前驱节点
struct listNode *prev; //listNode 带有prev 和next 两个指针,因此,对链表的遍历可以在两个方向上进行:从表头到表 尾,或者从表尾到表头。
// 后继节点
struct listNode *next;
// 值
void *value;
}
typedef struct list { //双端链表本身
// 表头指针
listNode *head; //list 保存了head 和tail 两个指针,因此,对链表的表头和表尾进行插入的复杂度为(1) ——这是高效 实现LPUSH 、RPOP 、RPOPLPUSH 等命令的关键
// 表尾指针
listNode *tail;
// 节点数量
unsigned long len; //list 带有保存节点数量的len 属性,所以计算链表长度的复杂度仅为(1) ,这也保证了LLEN 命令不 会成为性能瓶颈
// 复制函数 用于新增节点
void *(*dup)(void *ptr);
// 释放函数 用于删除节点
void (*free)(void *ptr);
// 比对函数
int (*match)(void *ptr, void *key);
}
小结:
双端链表及其节点的性能特性如下:
– 节点带有前驱和后继指针,访问前驱节点和后继节点的复杂度为O(1) ,并且对链表
的迭代可以在从表头到表尾和从表尾到表头两个方向进行;
– 链表带有指向表头和表尾的指针,因此对表头和表尾进行处理的复杂度为O(1) ;
– 链表带有记录节点数量的属性,所以可以在O(1) 复杂度内返回链表的节点数量(长
度);
- redis数据结构之双端链表
- Redis设计与实现系列-基本数据结构-链表和压缩列表
- Redis数据结构之链表
- Redis内部数据结构详解之压缩链表(ziplist)
- redis 系列4 数据结构之链表
- redis的双端链表
- Redis底层数据结构之链表
- 数据结构-双端链表
- redis数据结构-链表
- Java数据结构——双端链表
- Java模拟单链表和双端链表数据结构的实例讲解
- redis 列表的底层数据结构链表
- Redis源码剖析--双端链表Sdlist
- Redis之2-双端链表(adlist.c,adlist.h)
- 【Redis源码剖析】 - Redis内置数据结构之双向链表list
- 数据结构-双端链表
- 【Redis笔记(四)】 Redis数据结构 - list链表
- redis数据结构之一:链表
- Redis-05Redis数据结构--链表( linked-list)
- 数据结构之通用双端链表