一个链表需要实现的功能:插入,修改,删除
#include <iostream>
using namespace std;
const int N=1e6;
int e[N]; //e[i]表示第i个插入的值是e[i]
int ne[N]; //表示第i+1个插入的值的位置
int idx; //idx记录当前是第几个插入的数
int head;
单向链表
初始化:
void initialize()
{
head=-1; //表头指向-1 相当于*head=NULL
idx=0; //idx记录当前是第几个插入的数
}
链表末端指向-1
插入:
//从表头插入一个数
void add_to_head(int x)
{
e[idx]=x;
ne[idx]=head;
head=idx++;
}
//再第a个插入的数后插入b
void add(int a,int b)
{
e[idx]=b;
ne[idx]=ne[a]; //当前的点指向原来a指向的位置
ne[a]=idx++; //a指向当前点的位置
}
假的删除:
//删除第a个插入的数后面的数
void del(int a)
{
ne[a]=ne[ne[a]];//直接让a指向其下一个数所指的数
}
只能删除第n个插入的数后面的数,因为链表只能从前指向后
双向链表
在开一个数组,存前一个数的地址即可
int e[N],l[N],r[N],idx;
初始化;
void initialize()
{
l[1] = 0;
r[0] = 1;
idx = 2; //表头和表位各站一个,所以从2开始
}
在第a个插入的数右插入一个数
在做边插入只需add(l[a],x)即可
void add(int a,int x)
{
e[idx] = x;
l[r[k]] = idx;
r[idx] = r[k];//x这个数的左右两边都要建立边,方法同单链表
r[k] =idx;
l[idx++] = k;
}
假的删除:
让x左边的数直接指向x右边的数
让x右边的数直接指向x左边的数
void del(int a)
{
r[l[a]] = r[a];
l[r[a]] = l[a];
}
这样就可以删掉第a个插入的数了