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

程序的作用是:

  • 输入 nn 个整数 v 依次插入到链表头部。
  • 再进行 qq 次删除,每次尝试从链表中删除一个数据域为 v 的节点。
  • 删除完成后再正序遍历链表,输出所有数字。

关于 insertNode 函数、insertVal 函数、searchVal 函数、output 函数:

  • 此题的测试程序中没有提供这些函数,如果需要使用可以去其他题目复制。

你的任务是实现 deleteNode 函数:

  • 传入一个节点 p,并把它从链表中删除。
  • 如果链表中不存在该节点,则不能进行删除。

题型说明

解题时可以把题目提供的程序复制到编译器中,编写对应所需的函数,测试通过后只需要提交所需的函数,如果提交完整程序反而会 WA

格式要求

输入格式

第一行输入一个整数 n(1n100)n(1 \leq n \leq 100)

接下来一行,输入 nn 个整数 v

紧接着输入一个整数 q(1q100)q(1 \leq q \leq 100)

接下来 qq 行,每行一个整数 v,代表待删除的数字。

数据保证 v 的范围在 110001 \sim 1000,且插入的 v 都不重复。

输出格式

输出若干个整数,代表正序遍历链表里的所有数字,数字之间用空格隔开。

样例

4
2 1 7 4
3
7
10
2
4 1