Redis数据结构之链表--Redis设计与实现读书笔记


参考资料:《Redis设计与实现》
因为Redis使用的C语言没有实现链表,因此Redis构建了自己的链表实现。列表键、发布与订阅、慢查询、监视器等功能都用到了链表。

1 链表和链表节点的实现

每个链表使用adlist.h/listNode结构来表示:

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

多个listNode可以通过prev和next指针组成双向链表。
在这里插入图片描述
使用adlist.h/list来持有链表,操作会更加方便:

typedef struct list {
	listNode *head;
	listNode *tail;
	ubsigned long len;
	void *(*dup)(void *ptr);
	void (*del)(void *ptr);
	int (*match)(void *ptr,void *key);
} list;

表头指针head,表尾指针tail,链表长度计数器len,dup函数复制链表节点保持的值,free释放链表节点保存的值,match对比链表节点保存的值和另一个输入节点保存的值是否相等。listNode结构和list结构组成的链表如下。

在这里插入图片描述

2 链表特性

双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)
无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)
带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)
多态:链表节点使用void*指针来保存节点值,并且可以通过1ist结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值

3 链表API

函数作用时间复杂度
listSetDupMethod将给定的函数设置为链表的节点值复制函数可以通过链表的dup属性直接获得,O(1)
listSetDupMethod返回链表当前正在使用的节点值复制函数O(1)
listSetDupMethod将给定的函数设置为链表的节点值释放函数可以通过链表的free属性直接获得,O(1)
listSetDupMethod返回链表当前正在使用的节点值释放函数O(1)
listSetMatchMethod将给定的函数设置为链表的节点值对比函数可以通过链表的match属性直接获得,O(1)
listGetMatchMethod返回链表当前正在使用的节点值对比函数O(1)
listLength返回链表的长度(包含了多少个节点)链表长度可以通过链表的1en属性直接获得,O(1)
listFirst返回链表的表头节点表头节点可以通过链表的head属性直接获得,O1)
listLast返回链表的表尾节点表尾节点可以通过链表的tai1属性直接获得,O1)
listPrevNode返回给定节点的前置节点前置节点可以通过节点的prev属性直接获得,O1)
listNextNode返回给定节点的后置节点后置节点可以通过节点的next属性直接获得,O1)
listNodevalue返回给定节点目前正在保存的值节点值可以通过节点的value属性直接获得,O(1)
listCreate创建一个不包含任何节点的新链表O(1)
listAddNodeHead将一个包含给定值的新节点添加到给定链表的表头O(1)
listAddNodeTail将一个包含给定值的新节点添加到给定链表的表尾O(1)
listInsertNode将一个包含给定值的新节点添加到给定节点的之前或者之后O(1)
listSearchKey查找并返回链表中包含给定值的节点O(N),N为链表长度
listIndex返回链表在给定索引上的节点O(N),N为链表长度
listDelNode从链表中删除给定节点O(N),N为链表长度
listRotate从链表中删除给定节点将链表的表尾节点弹出,然后将被弹出的节点插入到链表的表头,成为新的表头节点O(1)
listDup复制一个给定链表的副本O(N),N为链表长度
listRelease释放给定链表,以及链表中的所有节点O(N),N为链表长度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值