在基于之前学习的数组模拟的单链表,https://blog.csdn.net/qq_63055790/article/details/135653461
来学习使用数组模拟双链表。
双链表顾名思义是基于单链表只能只有一个朝后指向的指针,双链表是每个节点前后都有的。
具体长相就酱紫:
然后我们默认最左端的头结点是0,最右端的结点是1。
init:初始化给最左右的两个节点赋值。
add:在k节点右边添加一个新的节点。
remove:删除k节点
代码模板:
#include
using namespace std;
const int N=1e5+10;
//双链表
int e[N],l[N],r[N],idx;
//初始化
void init()
{
//0表示左端点,1表示右端点
idx=2;
r[0]=1;
l[1]=0;
}
//在下标是k的点的右边,插入x
void add(int k,int x)
{
e[idx]=x;
l[idx]=k;
r[idx]=r[k];
//顺序不可改变
l[r[k]]=idx;
r[k]=idx;
idx++;
}
//删除第k个点
void remove(int k)
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
int main()
{
return 0;
}
例题:https://www.acwing.com/activity/content/problem/content/864/
#include
using namespace std;
const int N=1e5+10;
//双链表
int e[N],l[N],r[N],idx;
//初始化
void init()
{
//0表示左端点,1表示右端点
idx=2;
r[0]=1;
l[1]=0;
}
//在下标是k的点的右边,插入x
void add(int k,int x)
{
e[idx]=x;
l[idx]=k;
r[idx]=r[k];
//顺序不可改变
l[r[k]]=idx;
r[k]=idx;
idx++;
}
//删除第k个点
void remove(int k)
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
int main()
{
int n;
cin>>n;
init();
while(n--)
{
string op;
cin>>op;
int k,x;
if(op=="L")
{
cin>>x;
add(0,x);
}
if(op=="R")
{
cin>>x;
add(l[1],x);
}
if(op=="D")
{
cin>>k;
remove(k+1);
}
if(op=="IL")
{
cin>>k>>x;
add(l[k+1],x);
}
if(op=="IR")
{
cin>>k>>x;
add(k+1,x);
}
}
//遍历
for(int i=r[0];i!=1;i=r[i])
cout<
注:题目中要求的是第 k个插入的数并不是指当前链表的第 k 个数。所以我们需要在带入add和remove的时候需要给k+1,因为0, 1 节点的作用是边界。0为左边界,1为右边界。他俩在这里有点类似保留字的作用。所以idx是从2开始,所以要给我们相应的k+1。