#6021. 循环双链表删除
循环双链表删除
题目描述
已知以下程序:
#include <bits/stdc++.h>
using namespace std;
struct Node {
int val;
Node *nxt, *pre;
};
Node *head;
int tot;
// 已包含 insertNode 函数、insertVal 函数、searchVal 函数、output 函数,本题省略
// ...
// 请在此处实现 deleteNode 函数
// ...
int main() {
head = new Node;
head->nxt = head;
head->pre = head;
int n, q, v;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> v;
insertVal(head, v);
}
cin >> q;
while (q--) {
cin >> v;
Node *p = searchVal(v);
deleteNode(p);
}
output();
for (Node *p = head->nxt; p != head; ) {
Node *q = p->nxt;
delete p;
p = q;
}
delete head;
return 0;
}
程序的作用是:
- 输入 个整数
v依次插入到链表头部。 - 再进行 次删除,每次尝试从链表中删除一个数据域为
v的节点。 - 删除完成后再正序遍历链表,输出所有数字。
关于 insertNode 函数、insertVal 函数、searchVal 函数、output 函数:
- 此题的测试程序中没有提供这些函数,如果需要使用可以去其他题目复制。
你的任务是实现 deleteNode 函数:
- 传入一个节点
p,并把它从链表中删除。 - 如果链表中不存在该节点,则不能进行删除。
题型说明
解题时可以把题目提供的程序复制到编译器中,编写对应所需的函数,测试通过后只需要提交所需的函数,如果提交完整程序反而会 WA。
格式要求
输入格式
第一行输入一个整数 。
接下来一行,输入 个整数 v。
紧接着输入一个整数
接下来 行,每行一个整数 v,代表待删除的数字。
数据保证 v 的范围在 ,且插入的 v 都不重复。
输出格式
输出若干个整数,代表正序遍历链表里的所有数字,数字之间用空格隔开。
样例
4
2 1 7 4
3
7
10
2
4 1