redis--链表

链表

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为链表长度

你可能感兴趣的:(redis--链表)