10.22

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

输入格式:
输入第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

输出样例:
7 1 2 8 3 5

代码长度限制
16 KB
Python (python3)
时间限制
1000 ms
内存限制
256 MB
Java (javac)
时间限制
5000 ms
内存限制
256 MB
其他编译器
时间限制
100 ms
内存限制
10 MB
栈限制#include

include

include

include

using namespace std;

// 链表节点结构
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};

// 计算链表长度
int getLength(Node* head) {
int len = 0;
while (head) {
len++;
head = head->next;
}
return len;
}

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);

int n;
cin >> n;

// 创建初始链表
Node* head = nullptr;
Node* tail = nullptr;
for (int i = 0; i < n; ++i) {
    int val;
    cin >> val;
    Node* newNode = new Node(val);
    if (!head) {
        head = newNode;
        tail = newNode;
    } else {
        tail->next = newNode;
        tail = newNode;
    }
}

int m;
cin >> m;

// 处理每个操作
while (m--) {
    int op, k;
    cin >> op >> k;

    int len = getLength(head);

    if (op == 0) { // 插入操作
        int d;
        cin >> d;

        // 检查插入位置合法性
        if (k < 0 || k > len) {
            continue;
        }

        Node* newNode = new Node(d);
        if (k == 0) { // 表头插入
            newNode->next = head;
            head = newNode;
        } else { // 在第k个节点后插入
            Node* curr = head;
            int count = 1;
            while (count < k && curr) {
                curr = curr->next;
                count++;
            }
            if (curr) {
                newNode->next = curr->next;
                curr->next = newNode;
                // 如果插入到尾部,更新tail指针
                if (!newNode->next) {
                    tail = newNode;
                }
            }
        }
    } else { // 删除操作
        // 检查删除位置合法性
        if (k <= 0 || k > len) {
            continue;
        }

        if (k == 1) { // 删除头节点
            Node* temp = head;
            head = head->next;
            delete temp;
        } else { // 删除第k个节点
            Node* curr = head;
            int count = 1;
            while (count < k - 1 && curr) {
                curr = curr->next;
                count++;
            }
            if (curr && curr->next) {
                Node* temp = curr->next;
                curr->next = curr->next->next;
                // 如果删除的是尾节点,更新tail指针
                if (!curr->next) {
                    tail = curr;
                }
                delete temp;
            }
        }
    }
}

// 输出最终链表
Node* curr = head;
while (curr) {
    cout << curr->data << " ";
    curr = curr->next;
}
cout << endl;

// 释放内存
while (head) {
    Node* temp = head;
    head = head->next;
    delete temp;
}

return 0;

}

posted @ 2025-10-29 22:54  muyuxiaxing  阅读(6)  评论(0)    收藏  举报