数据结构习题(一)
单链表
实现一个单链表,链表初始为空,支持三种操作:
- 向链表头插入一个数;
- 删除第 k 个插入的数后面的数;
- 在第 k 个插入的数后插入一个数。
现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。
注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。
输入格式
第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:
H x
,表示向链表头插入一个数 x。D k
,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。I k x
,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。输出格式
共一行,将整个链表从头到尾输出。
数据范围
1≤M≤100000
所有操作保证合法。输入样例:
10 H 9 I 1 1 D 1 D 0 H 6 I 3 6 I 4 5 I 4 5 I 3 4 D 6输出样例:
6 4 6 5
-
#include <iostream>
-
-
using namespace std;
-
-
const int N = 100010;
-
-
-
// head 表示头结点的下标
-
// e[i] 表示节点i的值
-
// ne[i] 表示节点i的next指针是多少
-
// idx 存储当前已经用到了哪个点
-
int head, e[N], ne[N], idx;
-
-
// 初始化
-
void init()
-
{
-
head = -1;
-
idx = 0;
-
}
-
-
// 将x插到头结点
-
void add_to_head(int x)
-
{
-
e[idx] = x, ne[idx] = head, head = idx ++ ;
-
}
-
-
// 将x插到下标是k的点后面
-
void add(int k, int x)
-
{
-
e[idx] = x, ne[idx] = ne[k], ne[k] = idx ++ ;
-
}
-
-
// 将下标是k的点后面的点删掉
-
void remove(int k)
-
{
-
ne[k] = ne[ne[k]];
-
}
-
-
int main()
-
{
-
int m;
-
cin >> m;
-
-
init();
-
-
while (m -- )
-
{
-
int k, x;
-
char op;
-
-
cin >> op;
-
if (op == 'H')
-
{
-
cin >> x;
-
add_to_head(x);
-
}
-
else if (op == 'D')
-
{
-
cin >> k;
-
if (!k) head = ne[head];
-
else remove(k - 1);
-
}
-
else
-
{
-
cin >> k >> x;
-
add(k - 1, x);
-
}
-
}
-
-
for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
-
cout << endl;
-
-
return 0;
-
}
-
双链表
实现一个双链表,双链表初始为空,支持 55 种操作:
- 在最左侧插入一个数;
- 在最右侧插入一个数;
- 将第 kk 个插入的数删除;
- 在第 kk 个插入的数左侧插入一个数;
- 在第 kk 个插入的数右侧插入一个数
现在要对该链表进行 MM 次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第 kk 个插入的数并不是指当前链表的第 kk 个数。例如操作过程中一共插入了 nn 个数,则按照插入的时间顺序,这 nn 个数依次为:第 11 个插入的数,第 22 个插入的数,…第 nn 个插入的数。
输入格式
第一行包含整数 MM,表示操作次数。
接下来 MM 行,每行包含一个操作命令,操作命令可能为以下几种:
L x
,表示在链表的最左端插入数 xx。R x
,表示在链表的最右端插入数 xx。D k
,表示将第 kk 个插入的数删除。IL k x
,表示在第 kk 个插入的数左侧插入一个数。IR k x
,表示在第 kk 个插入的数右侧插入一个数。输出格式
共一行,将整个链表从左到右输出。
数据范围
1≤M≤1000001≤M≤100000
所有操作保证合法。输入样例:
10 R 7 D 1 L 3 IL 2 10 D 3 IL 2 7 L 8 R 9 IL 4 7 IR 2 2输出样例:
8 7 7 3 2 9
#include <iostream> using namespace std; const int N = 100010; int m; int e[N], l[N], r[N], idx; // 在节点a的右边插入一个数x void insert(int a, int x) { e[idx] = x; l[idx] = a, r[idx] = r[a]; l[r[a]] = idx, r[a] = idx ++ ; } // 删除节点a void remove(int a) { l[r[a]] = l[a]; r[l[a]] = r[a]; } int main() { cin >> m; // 0是左端点,1是右端点 r[0] = 1, l[1] = 0; idx = 2; while (m -- ) { string op; cin >> op; int k, x; if (op == "L") { cin >> x; insert(0, x); } else if (op == "R") { cin >> x; insert(l[1], x); } else if (op == "D") { cin >> k; remove(k + 1); } else if (op == "IL") { cin >> k >> x; insert(l[k + 1], x); } else { cin >> k >> x; insert(k + 1, x); } } for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' '; cout << endl; return 0; }
文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_54227557/article/details/120746603
- 点赞
- 收藏
- 关注作者
评论(0)