链表
redis中list的底层数据结构体如下,redis在listNode的基础上做了一层封装,提供了头节点、尾节点以及一些自定义的函数。
typedef struct listNode {
//前置节点
struct listNode *prev;
//后置节点
struct listNode *next;
//节点的值
void *value;
} listNode;
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;
复制代码
优点:
- 链表节点可以保存各种不同类型的值
- 获取链表中的节点数量的时间复杂度只需O(1)
- 获取链表的表头节点和表尾节点的时间复杂度只需O(1) ;
- 获取某个节点的前置节点或后置节点的时间复杂度只需O(1),而且这两个指针都可以指向 NULL,所以链表是无环链表
缺点:
- 链表每个节点之间的内存都是不连续的,意味着无法很好利用 CPU 缓存。能很好利用 CPU 缓存的数据结构就是数组,因为数组的内存是连续的,这样就可以充分利用 CP