数据结构
链表与邻链表
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;
}
// 在链表头插入一个数a
void 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的点的左边,插入x
void 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的右边插入x
add(l[k], x);
//删除第k个点
void remove(int k)
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}
发表回复