双向链表

双向链表的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;

typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;

特性如下:

  • 双端链表有 prev 和 next 指针,获取某个节点的前置节点和后置节点的时间复杂度都是 O(1)
  • 无环:表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL,对链表的访问以 NULL 为终点
  • 有表头指针和表尾指针:通过链表结构的 head 指针和 tail 指针,程序获取链表的表头节点和表尾节点的时间复杂度为 O(1)
  • 有链表长度字段:程序使用链表结构的 len 字段记录链表节点数,获取节点数量的时间复杂度为 O(1)
  • 多态性:链表节点使用 void* 指针来保存节点值,所以链表可以保存各种不同类型的值