链表
redis数据结构–链表:作为一种常用的数据结构,在这里就不详细介绍了。链表提供了高效的几点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。
1、链表和节点的实现
每个链表节点使用一个listNode结构来表示:
typedef struct listNode {
//前置节点
struct listNode *prev;
//后置节点
struct listNode *next;
//节点值
void *value;
}listNode;
多个listNode组成的双端链表如下图所示:
这里多了一个链表的操作节点:
typedef struct list{
//表头节点
listNode *head;
//表尾节点
listNode *tail;
//链表中的节点数
unsigned long len;
//复制函数,指定
void *(*dup) (void *ptr)
//释放函数
void (*free) (void *ptr)
//对比函数
void (*match) (void *ptr,void *key)
}list;
-
dup函数用于复制链表节点保存的值。
-
free函数用于释放链表节点保存的值。
-
match函数用于比较节点锁存的值和另一个输入值是否相等。
2、链表和节点API
下表列出了链表和节点的API:
函数 | 作用 | 时间复杂度 |
---|---|---|
listSetDupMethod | 将给定的函数设置为链表的节点值复制函数 | O(1) |
listGetDupMethod | 返回俩表当前正在使用的节点复制函数 | 通过dup属性获得,O(1) |
listSetFreeMethod | 将给定的函数设置为链表的节点值释放函数 | O(1) |
listGetFree | 返回当前链表正在使用的节点值释放函数 | O(1) |
listSetMatchMethod | 将给定函数设置为为链表节点值对比函数 | O(1) |
listGetMatchMethod | 返回链表当前正在使用的几点值对比函数 | O(1) |
listLength | 返回链表的长度(包含多少个节点) | 通过属性len获得,O(1) |
listFirst | 返回链表的表头节点 | O(1) |
listLast | 返回链表的表尾节点 | O(1) |
listPrevNode | 返回给定节点的前置节点 | O(1) |
listNextNode | 返回给定节点的后置节点 | O(1) |
listNodeVaue | 返回给定节点目前正在保存的值 | 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为链表长度 |