美文网首页
第三章 链表

第三章 链表

作者: 亮亮_ff3d | 来源:发表于2019-10-28 20:48 被阅读0次

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

链表在Redis中应用:

  • 列表键的底层实现:当一个列表键包含数量比较多的元素,或者列表中包含的元素都是比较长的字符串时;
  • 发布与订阅
  • 慢查询
  • 监视器
  • Redis服务器使用链表保存多个客户端的状态信息
  • 使用链表构建客户端输出缓冲区

链表和链表节点实现

链表节点结构

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

多个listNode可以通过prev和next指针组成双端链表


WechatIMG53.jpeg

使用adlist.h/list来持有链表的话,操作起来会更方便

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;
WechatIMG54.jpeg

Redis 链表实现的特性总结:

  • 双端:链表节点带有prev和next指针,获取前置节点和后置节点的复杂度都是0(1);
  • 无环:表头节点的prev指针和表尾节点的next指针都指向null,对链表的访问以null为终点;
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,获取链表的表头节点和表尾节点的复杂度为O(1).
  • 带链表长度计数器:使用list结构中len属性,对list持有的链表节点进行计数,获取链表中节点数量复杂度为O(1);
  • 多态:使用void* 指针保存节点的值,可以通过list结构的dup,free,match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。

链表和链表节点的API

函数:作用 时间复杂度
listSetDupMethod:将给定的函数设置为链表的节点值复制函数 O(1)
listGetDupMethod:返回链表当前正在使用的节点值复制函数 O(1)
listSetFreeMethod:将给定的函数设置为链表的节点值释放函数 O(1)
listGetFree:返回链表当前正在使用的节点值释放函数 O(1)
listSetMatchMethod:将给定的函数设置为链表的节点值对比函数 O(1)
listGetMatchMethod:返回链表当前正在使用的节点值对比函数 O(1)
listLength:返回链表的长度 O(1)
listFirst:返回链表的表头节点 O(1)
listLast:返回链表的表尾节点 O(1)
listPrevNote:返回给定节点的前置节点 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)
listRotate:将链表的表尾节点弹出,然后将被弹出的节点插入到链表的表头,称为新的表头节点 O(1)
listDup:复制一个给定链表的副本 O(n)
listRelease:释放给定链表,以及链表中所有的节点 O(n)

相关文章

  • 数据结构与算法相关续

    第三章 Java 1.HashMap 1)HashMap的数据结构? 哈希表结构(链表散列:数组+链表)实现,结合...

  • 第三章 链表

    链表是列表键的底层实现之一。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Red...

  • 第三章 链表

    基本概念 链表的含义: 链表是一种用于存储数据集合的数据结构,具有以下属性 相邻元素之间通过指针相连 最后一个元素...

  • 第三章 链表

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

  • 链表基础

    链表基础 链表长度 链表为空 链表结构 链表增加

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 算法与数据结构:链表

    链表 链表还分为单向链表和双向链表, 但是这篇文章只说单向链表 , 下次再讲双向链表 . 链表和数组的区别 ? 链...

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 五、双向链表

    双向链表 此前介绍的链表,也叫做单向链表使用双向链表可以提升链表的综合性能 修改之前的单链表的源码: 双向链表 –...

  • 链表

    内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 表 双向链表 循环链表 链表数据结...

网友评论

      本文标题:第三章 链表

      本文链接:https://www.haomeiwen.com/subject/svibvctx.html