输入
输入数据只有一组,第一行有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、因为输入数据中含有大量的插入和删除操作(不管你信不信,反正我信了),所以必须使用链表,否则很可能会超时。这也是考查链表的特性吧。
2、初始化链表的元素是倒序的,这个使用题目中创建列表的方法(从头部插入)就可以了。
总结:
这题考查的是链表的特性。顺序表中,怎样判断何时使用顺序表何时使用链表呢?就要看它们的特点了。顺序表的特点是随机存取、随机访问,也就是说如果存取和查询比较频繁的话使用顺序表比较合适;链表的特点是插入和删除时不必移动其后的节点,如果插入和删除操作比较频繁的话使用链表比较合适。
#include<bits/stdc++.h>
using namespace std;
struct Node{
int data;
Node* next;
Node(int d):data(d),next(NULL){}
Node():next(NULL){}
};
int len=0;
void Insert(Node*& root,int val){
if(root==NULL){
root=new Node(val);
len++;
}else{
Node *tmp=new Node(val);
tmp->next=root;
root=tmp;
len++;
}
}
void Delete(Node*& root,int a){
//删除第a个元素
//找到第a-1个
if(a>len||len==0){
printf("delete fail\n");
return;
}
Node *t=root,*q=NULL;
if(a==1){
q=root;
root=root->next;
delete(q);
printf("delete OK\n");
len--;
return;
}
int f=a-2;
while(f--){
t=t->next;
}
q=t->next;
t->next=q->next;
delete(q);
len--;
printf("delete OK\n");
}
void Get(Node*& root,int a){
if(a>len){
printf("get fail\n");
return;
}
Node *t=root;
a--;
while(a--){
t=t->next;
}
printf("%d\n",t->data);
}
void Show(Node*& root){
if(root==NULL){
printf("Link list is empty\n");
return;
}
Node *t=root;
while(t){
printf("%d ",t->data);
t=t->next;
}
printf("\n");
}
void Insert2(Node*& root,int a,int e){
//在第a个位置后插入e
if(a>len+1){
printf("insert fail\n");
return;
}
Node *t=root;
Node *q=new Node(e);
if(a==1){
if(root==NULL) root=q;
else{
q->next=root;
root=q;
}
len++;
printf("insert OK\n");
return;
}
int f=a-2;
while(f--) t=t->next;
q->next=t->next;
t->next=q;
len++;
printf("insert OK\n");
}
int main(){
int n,m,val;
Node *root=NULL;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d",&val);
Insert(root,val);
}
scanf("%d",&m);
string str;
int a,b;
ios::sync_with_stdio(0);
while(m--){
cin>>str;
if(str=="show") Show(root);
else if(str=="delete"){
cin>>val;
Delete(root,val);
}else if(str=="insert"){
cin>>a>>b;
Insert2(root,a,b);
}else if(str=="get"){
cin>>a;
Get(root,a);
}
}
return 0;
}