请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。
输出格式:
输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。
输入样例:
5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0
1 6
解题思路:
题目要求实现单链表的插入和删除操作。给定一个单链表和一系列插入、删除结点的操作序列,最终输出经过这些操作后的链表。
首先,我们使用一个list容器来表示单链表,这个容器能够动态地增加和删除元素。我们输入链表的长度n,并读取n个整数作为链表的元素,将它们逐个插入到list容器中。接下来,我们输入操作数量m,并根据操作序列进行插入和删除操作。
对于插入操作,我们需要输入三个整数:0 k d。这里k表示在第k个结点后插入,d表示要插入的结点的数据。如果k为0,则表示在表头插入。我们可以通过使用advance(it, u)函数将迭代器it移动到第k个结点的位置,然后使用link.insert(it, p)在该位置后插入数据为d的结点。
对于删除操作,我们需要输入两个整数:1 k。这里k表示要删除的结点的位置。我们首先通过使用advance(it, u - 1)函数将迭代器it移动到第k个结点的前一个位置,然后使用link.erase(it)删除该结点。
需要注意的是,对于不合法的操作,例如在长度为n的链表中删除第k(k>n)个结点,或者删除第0个结点,我们需要忽略这样的操作。
最后,我们遍历链表,并输出链表中的每个元素,以空格分隔。
完整代码:
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> link;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
link.push_back(num);
}
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int k;
cin >> k;
if (k == 0) {
int u, p;
cin >> u >> p;
auto it = link.begin();
advance(it, u);
if (u >= 0 && u <= link.size()) {
link.insert(it, p);
}
} else if (k == 1) {
int u;
cin >> u;
if (u > 0 && u <= link.size()) {
auto it = link.begin();
advance(it, u - 1);
link.erase(it);
}
}
}
for (auto it = link.begin(); it != link.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}