#P1006A. 链表删除M个节点
链表删除M个节点
说明
给出一个有N个节点的单链表,从头向尾输出删除M个节点后的链表。
输入格式
输入有多行。
第一行一个整数n。(n≤100000)
接下来n行,每行的格式是:id val nxt,分别表示新加入的节点的编号、节点存储的值、下个节点的编号。 nxt的值为-1时表示下个节点为空,头节点编号为1。
第n+2行一个整数M。
接下来M行每行一个整数,分别表示要删除的节点的编号。
输出格式
从头向尾输出每个节点存储的值。
样例
4
1 5 2
2 3 3
3 1 4
4 2 -1
1
2
5 1 2
参考程序
#include <iostream>
using namespace std;
struct Node
{
int val, nxt, pre;
} node[100005];
int n, m, head, x, now;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
int id, val, nxt;
cin >> id >> val >> nxt;
node[id].val = val;
node[id].nxt = nxt;
//建立起双向链表,方便删除
node[node[id].nxt].pre = id;
}
head = 1;
cin >> m;
for (int i = 1; i <= m; i++)
{
cin >> x;
//删除掉node[x],单独判断头尾
if (x == head)
head = node[head].nxt;
else if (node[x].nxt == -1)
node[node[x].pre].nxt = -1;
else
{
node[node[x].pre].nxt = node[x].nxt;
node[node[x].nxt].pre = node[x].pre;
}
}
now = head;
while (now != -1)
{
cout << node[now].val << " ";
now = node[now].nxt;
}
return 0;
}