思路参考部分其他题解
初始化两个节点:头节点0和尾节点1
0和1表示头和尾
#include<iostream>
using namespace std;
const int N = 100010;
int l[N],r[N],e[N];//存放左右节点位置,节点值
int idx;//节点数量
void init(){
r[0]=1;//head->next=tail;头节点的下一个节点为首节点
l[1]=0;//tail->front=head;//首节点的上一个节点为首节点
idx=2;//节点数量为2
}
在k点右边插入一个数
需要左边插入
如果需要在左边插入可以通过l[k]
调用k
左边的数字
在最两端插入,保持两端头尾01,在最两端不变
- 最左边插入头节点
0
,头的右边,放入0 - 最右边头节点
l[1]
,尾的左边
操作思路
每次操作都先将k后面的节点先接到idx上
先对idx操作
idx
的next
指向k
的下一个节点- 将
idx
的pr
指向k
节点
在对前后两个节点进行操作
k
的next的节点指向s- 如果
idx
后面有节点,pr指向s
void insertk_L(int k,int x){//
e[idx]=x;
l[idx]=k;//新节点->front=k;
r[idx]=r[k];//新节点->next=head->next
l[r[k]]=idx;//k->next->front=新节点
r[k]=idx;//k->next=新节点
idx++;
}
删除
跳过这个节点
先将前面的连到后面
在将后面的连到前面
void remove(int k){
r[l[k]]=r[k];//先将前面的连到后面
l[r[k]]=l[k];//在将后面的连到前面
}
输出
i=r[0]
从头0开始,i!=1
== i!=tail
时结束输出,i=r[i]
== i等于下一个节点
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' ';
最后代码
#include<iostream>
#include<string>
using namespace std;
const int N = 100010;
int l[N],r[N],e[N];
int idx;
int n;
void init(){
r[0]=1;//head->next=tail;头节点的下一个节点为首节点
l[1]=0;//tail->front=head;//首节点的上一个节点为首节点
idx=2;//内有两个节点
}
void insertk(int k,int x){//
e[idx]=x;
l[idx]=k;//新节点->front=k;
r[idx]=r[k];//新节点->next=head->next
l[r[k]]=idx;//head->next->front=新节点
r[k]=idx;//k->next=新节点
idx++;
}
void remove(int k){
r[l[k]]=r[k];//先将前面的连到后面
l[r[k]]=l[k];//在将后面的连到前面
}
int main(){
init();
cin>>n;
while(n--){
string x;
int k,y;
cin>>x;
if(x=="L"){
cin>>y;
insertk(0,y);//在最左边插入
}
else if(x=="R"){
cin>>y;
insertk(l[1],y);//在最右边插入
}
else if(x=="D"){
cin>>k;
remove(k+1);//删除k
}
else if(x=="IL"){
cin>>k>>y;
insertk(l[k+1],y);
}
else{
cin>>k>>y;
insertk(k+1,y);
}
}
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' ';
return 0;
}