单链表
两种形式
结构体形式 : 申请新节点太慢
struct List {
int data;
List *next;
}
数组模拟
代码模板
const int N = 1e6 + 10;
int e[N], ne[N], head, idx;
// 初始化:head存的是头结点下标,用idx分配空间
void init() {
head = -1; idx = 0;
}
// 头插法
void add_to_head(int x) {
e[idx] = x;
n[idx] = head;
head = idx;
idx++;
}
// 删除节点
void del(int k) {
n[k] = n[n[k]];
}
// 在第k个插入的数后插入一个数
void add(int k, int x) {
e[idx] = x;
n[idx] = n[k];
n[k] = idx;
idx++;
}
void display() {
for(int i = head; i != -1; i = ne[i)
printf("%d ", e[i]);
}
双链表(用于优化)
代码模板
const int N = 1e6 + 10;
int e[N], l[N], r[N], idx;
void insert(int a, int x) {
e[idx] = x;
l[idx] = a, r[idx] = r[a];
l[r[a]] = idx, r[a] = idx ++ ;
}
// 删除节点a
void remove(int a) {
l[r[a]] = l[a];
r[l[a]] = r[a];
}
邻接表
代码模板
const int N = 1e6 + 10;
int e[N], ne[N], h[N], idx;
void init() {
memset(h, -1, sizeof h);
idx = 0;
}
// 加边:(a, b)表示由a指向b
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
// 遍历: 表示以ver指向的节点
void travel(int r) {
for(int i = h[ver]; i != -1; i = ne[i])
printf("%d", e[i]);
}