单向链表
题目描述
实现一个数据结构,维护一张表(最初只有一个元素 1 1 1)。需要支持下面的操作,其中 x x x 和 y y y 都是 1 1 1 到 1 0 6 10^6 106 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 1 0 5 10^5 105:
1 x y
:将元素 y y y 插入到 x x x 后面;2 x
:询问 x x x 后面的元素是什么。如果 x x x 是最后一个元素,则输出 0 0 0;3 x
:从表中删除元素 x x x 后面的那个元素,不改变其他元素的先后顺序。
输入格式
第一行一个整数 q q q 表示操作次数。
接下来 q q q 行,每行表示一次操作,操作具体间题目描述。
输出格式
对于每个操作 2,输出一个数字,用换行隔开。
样例 #1
样例输入 #1
6
1 1 99
1 99 50
1 99 75
2 99
3 75
2 1
样例输出 #1
75
99
代码详解
#include "bits/stdc++.h"
using namespace std;
struct _node {
int l = 0, r = 0;
int val;
}ps[1000005];
int q, flag, x, y;
void _init() {
ps[1].val = 1;
}
int main() {
cin >> q;
_init();
while(q--) {
cin >> flag;
if(flag == 1) {
cin >> x >> y;
ps[y].val = y;
if(ps[x].r == 0) {
ps[x].r = y;
ps[y].l = ps[x].val;
}
else {
ps[y].r = ps[x].r;
ps[ps[x].r].l = y;
ps[x].r = y;
}
}
if(flag == 2) {
cin >> x;
cout << ps[x].r << endl;
}
if(flag == 3) {
cin >> x;
if(ps[x].r != 0) {
ps[x].r = ps[ps[x].r].r;
int flag = ps[ps[x].r].r;
ps[flag].l = x;
}
}
}
return 0;
}