Redis数据结构学习-链表(二)

链表

链表提供了高效的节点重排能力, 及顺序性节点访问方式, Redis构建了自己的链表实现

链表和链表节点的实现

typedef struct listNode{
  struct listNode *prev; // 前置节点
  struct listNode *next; // 后置节点
  void *value; // 节点值
}listNode;

多个listNode节点通过 prevnext指针组成双端链表, 虽然仅使用多个listNode就可以组成链表, 使用 adlist.h/list 来持有链表会更方便操作.

typedef struct list{
  listNode *head; // 表头节点
  listNode *tail; // 表尾结点
  unsigned long len; // 链表包含的节点数量
  void *(*dup)(void *ptr); // 节点值复制函数
  void (*free)(void *ptr); // 节点值释放函数
  int (*match)(void *ptr, void *key); 节点值对比函数
} list;

list结构为链表提供了表头指针head、表尾指针tail, 及链表长度计数器len, 而udp, free, match成员则用于实现多态链表所需特定函数.

Redis 链表实现特性总结
  • 双端: 有prevnext指针, 获取前置和后置节点的复杂度都是O(1)
  • 无环: 表头的prev和表尾的next都指向NULL, 对链表的访问以NULL为终点
  • 带表头和表尾指针: 通过list结构的head和tail指针获取链表的头结点和尾结点复杂度为 O(1)
  • 带长度计数器: 程序使用list结构的len属性对list节点计数, 获取节点数量的复杂度O(1)
  • 多态: 链表节点使用 void *指针保存节点值, 可通过list结构的dup, free, match三个属性为节点值设置类型特定的函数, 所以链表可用来保存不同类型的节点值
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是数组? 数组简单来说就是将所有的数据排成一排存放在系统分配的一个内存块上,通过使用特定元素的索引作为数组的下...
    启明_b56f阅读 1,004评论 0 0
  • 前言   托更了一天,因为新型肺炎疫情的影响,公司昨天开工了。长时间在家里待着,突然开工了。比较不适应,觉得比较疲...
    于情于你阅读 220评论 0 1
  • 本文内容:1、 什么是链表?2、 链表共分几类?3、 链表的 C 实现! 总表:《数据结构?》 工程代码 Gith...
    半纸渊阅读 40,129评论 0 54
  • tips:本文参照《redis设计与实现》、《数据结构与算法》、redis源码 链表提供了高效的节点重排能力,以及...
    TOUCH_d36e阅读 450评论 0 0
  • redis使用两种数据结构保存链表,分别是ziplist与linkedlist,内存占用及常用操作效率各不相同。本...
    但莫阅读 1,210评论 0 1