AcWing 827. 双链表
原题链接
简单
作者:
云_580
,
2024-09-05 11:22:38
,
所有人可见
,
阅读 1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int e[N],l[N],r[N],idx;
//初始化,0为头节点,1为尾节点
void init(){
r[0]=1;l[1]=0;idx=2;
}
//插到头节点之后
void insert_head(int x){
e[idx]=x;r[idx]=r[0];l[idx]=0;l[r[0]]=idx;r[0]=idx;idx++;
}
//插到尾节点之后
void insert_tail(int x){
e[idx]=x;r[idx]=1;l[idx]=l[1];r[l[1]]=idx;l[1]=idx;idx++;
}
//插到第k个数的左边
void insert_left(int k,int x){
e[idx]=x;r[idx]=k;l[idx]=l[k];r[l[k]]=idx;l[k]=idx;idx++;
}
//插到第k个数的右边
void insert_right(int k,int x){
e[idx]=x;r[idx]=r[k];l[idx]=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();
for(int i = 1;i<=n;i++){
char ch;
int a,b;
cin>>ch;
if(ch=='L'){
cin>>a;
insert_head(a);
}else if(ch=='R'){
cin>>a;
insert_tail(a);
}else if(ch=='D'){
cin>>a;
//这里是a+1,因为idx从2开始
remove(a+1);
}else{
cin>>ch;
if(ch=='R'){
cin>>a>>b;
insert_right(a+1,b);
//这里是a+1,因为idx从2开始
}else{
cin>>a>>b;
insert_left(a+1,b);
//这里是a+1,因为idx从2开始
}
}
}
//i从r[0]开始枚举,直到i=1;
for(int i = r[0];i!=1;i=r[i])cout<<e[i]<<" ";
return 0;
}