链表的基本操作

题目链接

输入

输入数据只有一组,第一行有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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值