#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;
}