#6022. 操作循环双链表

操作循环双链表

题目描述

循环双链表的节点定义如下:

struct Node {
	int val;
	Node *nxt, *pre;
}; 
Node *head; // 头节点
int tot; // 统计节点数量

链表的操作有以下 88 种:

  • 1 v,在链表头部插入值为 v 的节点。
  • 2 v,在链表尾部插入值为 v 的节点。
  • 3 x v,在第一个数据域为 x 的节点后插入值为 v 的节点,如果不存在数据域为 x 的节点,则忽略删除操作。
  • 4 x v,在第一个数据域为 x 的节点前插入值为 v 的节点,如果不存在数据域为 x 的节点,则忽略删除操作。
  • 5 v,删除数据域为 v 的节点,如果不存在数据域为 v 的节点,则忽略删除操作。
  • 6,正序遍历链表,输出所有节点的数据域。
  • 7,倒序遍历链表,输出所有节点的数据域。
  • 8,输出链表中的节点数量。

格式要求

输入格式

第一行先输入一个整数 nn,代表操作次数。

接下来 nn 行,每行先输入一个整数 opop,代表操作类型,根据操作类型,会再输入 xxvv

5n1045 \leq n \leq 10^41op81 \leq op \leq 81x,v1071 \leq x, v \leq 10^7

输出格式

输出若干行,每行代表操作 686 \sim 8 的一次输出,同一行里的数字间用空格隔开。

样例

12
1 5
2 10
1 3
6
3 5 7
6
4 3 8
6
5 3
6
7
8
3 5 10
3 5 7 10
8 3 5 7 10
8 5 7 10
10 7 5 8
4

样例解释

步骤 操作 说明 链表状态 tot
1 1 5 头部插入5 5 1
2 2 10 尾部插入10 5 10 2
3 1 3 头部插入3 3 5 10 3
4 6 正序遍历输出 输出 3 5 10
5 3 5 7 在5后面插入7 3 5 7 10 4
6 6 正序遍历输出 输出 3 5 7 10
7 4 3 8 在3前面插入8 8 3 5 7 10 5
8 6 正序遍历输出 输出 8 3 5 7 10
9 5 3 删除值为3的节点 8 5 7 10 4
10 6 正序遍历输出 输出 8 5 7 10
11 7 倒序遍历输出 输出 10 7 5 8
12 8 输出节点数量 输出 4