经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
redis系列之------链表
来源:cnblogs  作者:wenbochang  时间:2019/10/15 8:51:16  对本文有异议

前言

链表提供了高效的节点重排能力, 以及顺序性的节点访问方式, 并且可以通过增删节点来灵活地调整链表的长度。

作为一种常用数据结构, 链表内置在很多高级的编程语言里面, 因为 Redis 使用的 C 语言并没有内置这种数据结构, 所以 Redis 构建了自己的链表实现。

大家可以把Redis的链表实现,和Java的LinkedList实现进行对比,看下哪个更加厉害一点。

 

链表定义

  1. 1 typedef struct listNode {
  2. 2
  3. 3 // 前置节点
  4. 4 struct listNode *prev;
  5. 5
  6. 6 // 后置节点
  7. 7 struct listNode *next;
  8. 8
  9. 9 // 节点的值
  10. 10 void *value;
  11. 11
  12. 12 } listNode;

 

多个 listNode 可以通过 prev 和 next 指针组成双端链表, 如图 3-1 所示。

虽然仅仅使用多个 listNode 结构就可以组成链表, 但使用 adlist.h/list 来持有链表的话, 操作起来会更方便:

 

  1. 1 typedef struct list {
  2. 2
  3. 3 // 表头节点
  4. 4 listNode *head;
  5. 5
  6. 6 // 表尾节点
  7. 7 listNode *tail;
  8. 8
  9. 9 // 链表所包含的节点数量
  10. 10 unsigned long len;
  11. 11
  12. 12 // 节点值复制函数
  13. 13 void *(*dup)(void *ptr);
  14. 14
  15. 15 // 节点值释放函数
  16. 16 void (*free)(void *ptr);
  17. 17
  18. 18 // 节点值对比函数
  19. 19 int (*match)(void *ptr, void *key);

 

 

我们可以看到,list包含链表的头节点,尾节点以及长度。这就为链表带来了很多的好处,如下:

  • 双端: 链表节点带有 prev 和 next 指针, 获取某个节点的前置节点和后置节点的复杂度都是 O(1) 。
  • 无环: 表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL , 对链表的访问以 NULL 为终点。
  • 带表头指针和表尾指针: 通过 list 结构的 head 指针和 tail 指针, 程序获取链表的表头节点和表尾节点的复杂度为 O(1) 。
  • 带链表长度计数器: 程序使用 list 结构的 len 属性来对 list 持有的链表节点进行计数, 程序获取链表中节点数量的复杂度为 O(1)。

 

原文链接:http://www.cnblogs.com/wenbochang/p/11666863.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号