📅  最后修改于: 2023-12-03 15:12:41.594000             🧑  作者: Mango
这是一道典型的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;
}
需要注意到链表的头指针要在类中定义,并且各个操作要进行参数的有效性检查。
根据题意建立主函数,逐一读入操作并在链表上进行相应操作即可。