Redis数据结构-双端链表

277 阅读1分钟

一、数据结构

链表作为列表键的底层实现之一,当列表中包含了数量比较多的元素,又或者列表中都是比较长的字符串时,列表就会使用链表作为底层的实现。

typedef struct listNode {
    listNode * prev;
    listNode * next;
    void * value;
}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;

二、API

函数 作用 时间复杂度
listLength 返回链表长度 O(1)
listFirst 返回链表的头节点 O(1)
listLast 返回链表的尾节点 O(1)
listPrevNode 返回给定节点的前驱结点 O(1)
listNextNode 返回给定节点的后继结点 O(1)
listNodeValue 返回给定节点保存的值 O(1)
listCreate 创建一个不包含任何节点的链表 O(1)
listAddNodeHead 在链表的头部添加一个节点 O(1)
listAddNodeTail 在链表的尾部添加一个节点 O(1)
listInsertNode 在一个节点的前面或后面插入一个节点 O(1)
listSearchKey 查找节点值为给定值的节点 O(n)
listIndex 返回给定索引的节点 O(n)
listDelNode 从链表删除给定节点 O(n)
listDup 复制一个给定链表的副本 O(n)
listRelease 释放链表所有节点 O(n)