📜  门| GATE-CS-2006 |第71章(1)

📅  最后修改于: 2023-12-03 15:12:41.594000             🧑  作者: Mango

门 | GATE-CS-2006 | 第71章

这是一道典型的GATE-CS 2006的问题,需要了解计算机科学方面的基本概念和编程技能才能解决。本题旨在测试考生的算法设计和编码能力。

题目描述

有一条n个节点的链表和一组m个数据操作,每个操作要么在链表的前面插入一个数据,要么在后面插入一个数据,要么从链表中删除一个数据,要么对链表的某个数据进行修改。给定初始的链表和操作序列,请给出最终的链表。

输入格式

输入的格式为:

n m
a1 a2 ... an
o1 d1 [x1] [y1]
o2 d2 [x2] [y2]
...
om dm [xm] [ym]

其中n表示链表的长度,m表示操作的数量,ai表示链表中第i个节点的数据,第j个操作的编号为oj,oj的取值为1、2、3或4,分别表示在链表的前面插入一个数据、在后面插入一个数据、删除一个数据和修改一个数据。当oj为1或2时,后面的两个数di和xi代表要插入的数据和需要修改的数据的位置;当oj为3时,后面的数di代表要删除的位置,而xi和yi不起作用;当oj为4时,后面的三个数di、xi和yi表示要修改的位置和修改后的数据,如果修改的位置超出了链表的长度,则不进行任何操作。

输出格式

输出最终的链表,每个节点的数据之间用空格隔开,最后一个节点后面不允许有空格。

样例输入
5 3
1 2 3 4 5
1 1 9
2 3 6
3 5
样例输出
9 2 6 3
算法设计

根据题目描述,需要知道链表的基本操作,即插入、删除和修改,以下是对于这三个操作在代码中的实现:

// 插入节点 (data为插入的数据,pos为插入的位置)
void insert(int data, int pos) {
    if (pos < 0 || pos > this->size())
        return;
    ListNode *p = new ListNode(data);
    if (!p)
        return;
    if (pos == 0) { // 插在链表头部
        p->next = this->head;
        this->head = p;
    } else { // 插在链表中间或尾部
        ListNode *prev = this->get(pos-1);
        if (prev != nullptr) {
            p->next = prev->next;
            prev->next = p;
        }
    }
}

// 删除节点 (pos为要删除的位置)
void remove(int pos) {
    if (pos < 0 || pos >= this->size())
        return;
    if (pos == 0) { // 删除链表头部
        ListNode* p = this->head;
        this->head = p->next;
        delete p;
    } else { // 删除链表中间或尾部
        ListNode *prev = this->get(pos-1);
        if (prev != nullptr) {
            ListNode *p = prev->next;
            prev->next = p->next;
            delete p;
        }
    }
}

// 修改节点 (pos为要修改的位置,data为修改后的数据)
void modify(int pos, int data) {
    if (pos < 0 || pos >= this->size())
        return;
    ListNode *p = this->get(pos);
    if (p != nullptr)
        p->data = data;
}

需要注意到链表的头指针要在类中定义,并且各个操作要进行参数的有效性检查。

根据题意建立主函数,逐一读入操作并在链表上进行相应操作即可。

C++ 代码