PTA-单链表基本操作

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

输入格式:


输入第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

PTA-单链表基本操作_第1张图片

解题思路:


题目要求实现单链表的插入和删除操作。给定一个单链表和一系列插入、删除结点的操作序列,最终输出经过这些操作后的链表。
首先,我们使用一个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;
}

你可能感兴趣的:(数据结构,数据结构,链表)