原始题目
题题目描述
链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。
输输入
输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。
第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。如果是“get”或者“delete”,则其后跟着一个整数a,代表获得或者删除第a个元素;如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e;“show”之后没有整数。
输输出
如果获取成功,则输出该元素;如果删除成功则输出“delete OK”;如果获取失败或者删除失败,则输出“get fail”以及“delete fail”。如果插入成功则输出“insert OK”,否则输出“insert fail”。如果是“show”则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty”。注:所有的双引号均不输出。
样样例输入
3 3 2 1 21 show delete 1 show delete 2 show delete 1 show delete 2 insert 2 5 show insert 1 5 show insert 1 7 show insert 2 5 show insert 3 6 show insert 1 8 show get 2
样样例输出 复制
1 2 3 delete OK 2 3 delete OK 2 delete OK Link list is empty delete fail insert fail Link list is empty insert OK 5 insert OK 7 5 insert OK 7 5 5 insert OK 7 5 6 5 insert OK 8 7 5 6 5 7
分析:
大模拟作业,用自定义的链表结构来进行操作即可。
有个坑点,输入的进行操作的位置数可能是小于1(不合法的),要进行特判
另外为了不用多余代码,插入了一个虚拟头结点,其值为-1,方便删除真正的头元素,从其之后进行操作即可。
AC代码:
// Problem: B: 算法2-8~2-11:链表的基本操作
// Contest: BUCTOJ
// URL: https://buctoj.com/problem.php?cid=2759&pid=1
// Memory Limit: 32 MB
// Time Limit: 1000 ms
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
const int N = 2e5 + 10;
const int MOD = 1e9 + 7;
#define endl '\n'
#define PY puts("Yes")
#define PN puts("No")
struct MyList
{
MyList()
{
val = 0;
next = nullptr;
}
MyList(int x)
{
val = x;
next = nullptr;
}
int val;
MyList *next;
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<int> raw_input(n);
for (int i = 0; i < n; i++)
cin >> raw_input[i];
reverse(raw_input.begin(), raw_input.end());
MyList *head = new MyList(-1);
MyList *p = head;
for (int i = 0; i < n; i++)
{
MyList *cur = new MyList(raw_input[i]);
p->next = cur;
p = p->next;
}
int m;
cin >> m;
while (m--)
{
string s;
cin >> s;
if (s == "show")
{
p = head->next;
if (!p)
{
cout << "Link list is empty" << endl;
continue;
}
while (p)
{
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
else if (s == "delete")
{
p = head;
int cnt = 1;
int m;
cin >> m;
while (p && cnt < m)
{
p = p->next;
cnt++;
}
if (m < 1 || !p || !p->next)
{
cout << "delete fail" << endl;
continue;
}
p->next = p->next->next;
cout << "delete OK" << endl;
}
else if (s == "insert")
{
p = head;
int cnt = 1;
int a, m;
cin >> m >> a;
while (p && cnt < m)
{
p = p->next;
cnt++;
}
if (m < 1 || !p)
{
cout << "insert fail" << endl;
continue;
}
MyList *newcreate = new MyList(a);
newcreate->next = p->next;
p->next = newcreate;
cout << "insert OK" << endl;
}
else if (s == "get")
{
p = head->next;
int cnt = 1;
int m;
cin >> m;
while (p && cnt < m)
{
p = p->next;
cnt++;
}
if (m < 1 || !p)
{
cout << "get fail" << endl;
continue;
}
cout << p->val << endl;
}
}
return 0;
}