以下是链表的结构:
typedef struct list {
listNode *head; /* 头指针 */
listNode *tail; /* 尾指针 */
void *(*dup)(void *ptr); /* 节点复制函数 */
void (*free)(void *ptr); /* 节点释放函数 */
int (*match)(void *ptr, void *key); /* 节点值对比函数 */
unsigned long len; /* 链表所包含的节点数量 */
} list;
以下是链表节点的结构:多个listNode通过prev和next指针组成双向链表
typedef struct listNode {
struct listNode *prev; /* 前置节点 */
struct listNode *next; /* 后置节点 */
void *value; /* 节点的值 */
} listNode;
以下的结构组成图来自《redis设计与实现》一书
链表有以下这些特性:
- 因为有head和tail指针,所以获取头结点和尾节点的时间复杂度都是O(1)
- 表头节点的prev指针和表尾节点的next指针都指向NULL,所以是无环的
- 获取表头节点和表尾节点的时间复杂度也是O(1)
- 链表结构中有len属性来保存链表的节点数,这样获取链表中的节点数量的时间复杂度也是O(1)
- 多态:链表可以用来保存不同类型的值
- 有关链表和链表节点的API可以在<adlist.h>和<adlist.c>中查看