数据结构
链表与邻链表
struct Node{ int val; Node *next}new Node(); //十分慢
数组模仿单链表 动态链表
int head; //头节点int e[N]; //值int ne[N]; //next指针int idx; //数组用到第几个点// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert_head(int a){ e[idx] = a; ne[idx] = head; head = idx; idx++ ;}// 将头结点删除,须要保障头结点存在void remove(){ head = ne[head];}// 将a插入到第k个点前面void add(int k, int a){ e[idx] = a; ne[idx] = ne[k]; ne[k] = idx; idx ++;}//将下标是k的后边的点删掉void remove(int k){ ne[k] = ne[ne[k]];}
数组模仿双链表(优化某些问题)
每一个点有两个指针
int e[N];int l[N];int r[N];//初始化void init(){ // 0示意左端点(head), 1示意右端点(tail) r[0] = 1; l[1] = 0; idx = 2;}//在下标是k的点的左边,插入xvoid add(int k, int x){ e[idx] = x; r[idx] = r[k]; //不能用 k + 1 l[idx] = k; l[r[k]] = idx; //不能用 k + 1 r[k] = idx; }//在k的右边插入xadd(l[k], x);//删除第k个点void remove(int k){ r[l[k]] = r[k]; l[r[k]] = l[k];}