AcWing 827. 双链表
原题链接
简单
作者:
Hope_
,
2021-06-05 20:32:00
,
所有人可见
,
阅读 231
每一个操作都实现的代码。。
#include<iostream>
#include<string>
using namespace std;
const int N=100010;
int m;
int idx;
int e[N],l[N],r[N];
//初始化
void init(){
l[1]=0,r[0]=1;
idx=2;
}
//在第k个结点的右侧插入一个结点
//在第k个结点的左侧插入一个结点实际上就是在l[k]插入 注意不是k-1
void InsertR(int k,int x){
e[idx]=x;
l[idx]=k;
r[idx]=r[k];
l[r[k]]=idx;
r[k]=idx;
idx++;
}
//在链表的最右端插入一个点
void Rinsert(int x){
e[idx]=x;
r[idx]=1;
l[idx]=l[1];
r[l[1]]=idx;
l[1]=idx++;
}
//在链表的最左端插入一个点
void Linsert(int x){
l[idx]=0;
r[idx]=r[0];
l[r[0]]=idx;
r[0]=idx;
e[idx++]=x;
}
//删除第k个点
void DeletK(int k){
r[l[k]]=r[k];
l[r[k]]=l[k];
//r[l[k]]=r[k];
}
int main(){
init();
cin >> m;
while(m--){
string s;
int x;
int k;
cin>>s;
if(s=="L")
{
//cin >> x;
//Rinsert(x);
cin >> x;
Linsert(x);
}
else if(s=="R")
{
cin >> x;
Rinsert(x);
//cin >> x;
//InsertR(0, x);
}
else if(s=="D")
{
cin >> k;
DeletK(k + 1);
}
//else if(s=="IL")
//{
// cin>>x>>k;
// InsertR(l[k+1],x);
//}
else if(s=="IL")
{
cin >> k >> x;
InsertR(l[k + 1], x);
}
else
{
cin >> k >> x;
InsertR(k + 1, x);
}
}
for(int i = r[0]; i != 1; i = r[i])
cout << e[i] << ' ';
return 0;
}