B3631 单向链表
单向链表
题目描述
实现一个数据结构,维护一张表(最初只有一个元素 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
解题思路
这道题是一个很典型的单向链表的题目。
这里使用的方法是y总给的那套模板,但是要稍微修改一下,因为这里题目要求没有是按照第几个插入的数字来的,,而是去直接按照数字的值来进行。
又因为题目上说没有重复的数字 所以直接以每个数字本身来当下标就可以了。具体AC代码如下
代码
#include <iostream>using namespace std;
const int N = 1000010;int e[N], ne[N];void init()
{e[1] = 1;ne[1] = -1;
}//将元素 y 插入到x 后面
void insert(int x, int y)
{e[y] = y;ne[y] = ne[x];ne[x] = y;
}void remove(int x)
{ne[x] = ne[ne[x]];
}int main()
{init();int q;cin >> q;while (q--){int p;cin >> p;int x, y;if (p == 1){cin >> x >> y;insert(x,y);}else if ( p == 2){cin >> x;if (ne[x] == -1) cout << "0\n";else cout << e[ne[x]] << '\n';}else {cin >> x;remove(x);}}return 0;
}