链表提供了高效的节点重排,顺序性节点访问,并可以通过增删节点灵活调整链表的长度。链表是双向无环的。
3.1 链表和链表节点的实现
1. 节点
typedef struct listNode{ //前置节点 struct listNode *prev; //后置节点 struct listNode *next; //节点的值 void *value; }
2. 外层封装
typedef struct list{ //表头节点 listNode *head; //表尾节点 listNode *tail; //链表所包含的节点数量 unsigned long len; //节点值复制函数 void *(*dup)(void *ptr); //节点值释放函数 void (*free)(void *ptr); //节点值对比函数 int (*match)(void *ptr, void *key); }
Redis链表的实现特性:
- 双端:一个节点寻找前后节点的复杂度O(1)
- 无环:表头之前,表尾之后均指向NULL,对链表的访问以NULL为止
- 带表头指针和表尾指针:获取表头和表尾节点的复杂度O(1)
- 带链表长度计数器:获取节点数量复杂度O(1)
- 多态:dup、free、match三个属性定义节点的值进行操作,通过具体的实现,链表可以保存各种类型的值