• 【基础算法】单链表


    实现一个单链表,链表初始为空,支持三种操作:

    (1) 向链表头插入一个数;

    (2) 删除第k个插入的数后面的数;

    (3) 在第k个插入的数后插入一个数

    现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。

    注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。

    输入格式

    第一行包含整数M,表示操作次数。

    接下来M行,每行包含一个操作命令,操作命令可能为以下几种:

    (1) “H x”,表示向链表头插入一个数x。

    (2) “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。

    (3) “I k x”,表示在第k个输入的数后面插入一个数x(此操作中k均大于0)。

    输出格式

    共一行,将整个链表从头到尾输出。

    数据范围

    1M1000001≤M≤100000
    所有操作保证合法。

    输入样例:

    10
    H 9
    I 1 1
    D 1
    D 0
    H 6
    I 3 6
    I 4 5
    I 4 5
    I 3 4
    D 6
    

    输出样例:

    6 4 6 5

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    const int N=100000 +10;
    int e[N],en[N],head,id;
    
    void init(){
        head=-1;
        id=0;
    }
    
    void add_to_head(int x){
        e[id]=x;
        en[id]=head;
        head=id++;
    }
    
    void add(int k,int x){
        e[id]=x;
        en[id]=en[k];
        en[k]=id++;
    }
    
    void re_move(int k){
        en[k]=en[en[k]];
    }
    
    int main(){
        int T,k,x;
        cin>>T;
        init();
        
        while(T--){
            char op;
            cin>>op;
            if(op=='H'){
                cin>>x;
                add_to_head(x);
            }
            else if(op=='D'){
                cin>>k;
                if(!k) head=en[head];
                else  re_move(k-1);
            }
            else{
                cin>>k>>x;
                add(k-1,x);
            }
        }
        
        for(int i=head;i!=-1;i=en[i]) printf("%d ",e[i]);
        return 0;
    }

     

  • 相关阅读:
    NLog简单配置与使用
    C#将类对象转换为字典
    .net中RSA加密解密
    .net引用System.Data.SQLite操作SQLite
    mongodb的安装以及客户端
    web api 二
    c语言中字符串的存储方式(转)
    cjson两种数组的解析方法(转)
    RT-Thread 自动初始化详解
    RTT与NRF52832移植问题记录
  • 原文地址:https://www.cnblogs.com/Attacking-vincent/p/12965964.html
Copyright © 2020-2023  润新知