AcWing 827. 双链表
原题链接
简单
作者:
Shimmers微光
,
2021-07-15 17:28:56
,
所有人可见
,
阅读 213
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int e[N], l[N], r[N], idx;
//初始化
void init() {
//下标0表示头结点, 下标1表示尾结点 (头尾结点不放值, 无实质性内容)
r[0] = 1, l[1] = 0;
idx = 2; //0和1都被用了, 所以从2开始
}
//在下标是k的点右边插入一个值为x的点
void add(int k, int x) {
e[idx] = x;
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx++;
}
//删除第k个点
void remove(int k) {
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main() {
int m; cin >> m;
init();
while(m--) {
string s;
cin >> s;
int k, x;
//在链表的最左端插入数x (即在头结点右边插入x)
if(s == "L") {
cin >> x;
add(0, x);
//在链表的最右端插入数x (即在尾结点左边插入x)
} else if(s == "R") {
cin >> x;
add(l[1], x);
//将第 k 个插入的数删除 (因为0和1都被占用, 所以第1个节点也就是2=1+1, 则第k个插入结点的下标是k+1)
} else if(s == "D") {
cin >> k;
remove(k+1);
//在第 k 个插入的数左侧插入一个数 (第k个插入结点的下标是k+1)
} else if(s == "IL") {
cin >> k >> x;
add(l[k+1], x);
//在第 k 个插入的数右侧插入一个数 (第k个插入结点的下标是k+1)
} else {
cin >> k >> x;
add(k+1, x);
}
}
//由于头0尾1结点无实质性内容, 所以输出从r[0]开始, 到r[1]结束
for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << " ";
cout << endl;
return 0;
}