建立:
开始设0,1表示左端点和右端点,e[]用来存节点的值,l[]用来存节点右节点的序号,r[]用来存左节点的序号。
插入:
函数定义为在第k个数的右边插入值为x的数
一共需要更改四条路径:idx(要插入的数的编码)的左边是k, idx的右边是k的右边
k的右边是idx,k的右边的左边是idx。
看起来很绕,其实挺直接的, 就是将k右边的数以k为参考用l,r描述出来
删除:
使k的右边的左边是k的左边,k的左边的右边是k的右边就可以了。可以想象成越过数拉绳子
注意:
idx的初始值是2,如果是0的话,循环输出会没有尽头。
#include<iostream>
using namespace std;
const int N = 100010;
int e[N], l[N], r[N];
int idx = 2;
void insert(int k, int x){
// cout << "**";
e[idx] = x;
r[idx] = r[k], l[r[k]] = idx;
l[idx] = k, r[k] = idx ++;
//cout << "**";
return;
}
void del(int k){
l[r[k]] = l[k], r[l[k]] = r[k];
//cout << "**";
return;
}
int main(){
int m;
cin >> m;
l[1] = 0, r[0] = 1;
while(m --){
string line;
cin >> line;
int x, k;
if(line == "L"){
cin >> x;
insert(0, x);
}
else if(line == "R"){
cin >> x;
insert(l[1], x);
}
else if(line == "IL"){
cin >> k >> x;
insert(l[k + 1], x);
}
else if(line == "IR"){
cin >> k >> x;
insert(k + 1, x);
}
else{
cin >> k;
del(k + 1);
}
}
for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
return 0;
}