数据结构

链表与邻链表

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];}

邻接表 存储树和图


栈与队列

栈(先进后出)

队列(先进先出)

kmp