zoukankan      html  css  js  c++  java
  • 数组实现双链表

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

    (1) 在最左侧插入一个数;

    (2) 在最右侧插入一个数;

    (3) 将第k个插入的数删除;

    (4) 在第k个插入的数左侧插入一个数;

    (5) 在第k个插入的数右侧插入一个数

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

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

    输入格式
    第一行包含整数M,表示操作次数。

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

    (1) “L x”,表示在链表的最左端插入数x。

    (2) “R x”,表示在链表的最右端插入数x。

    (3) “D k”,表示将第k个插入的数删除。

    (4) “IL k x”,表示在第k个插入的数左侧插入一个数。

    (5) “IR k x”,表示在第k个插入的数右侧插入一个数。

    输出格式
    共一行,将整个链表从左到右输出。

    数据范围
    1 ≤ M ≤ 100000
    所有操作保证合法。

    输入样例:
    10
    R 7
    D 1
    L 3
    IL 2 10
    D 3
    IL 2 7
    L 8
    R 9
    IL 4 7
    IR 2 2
    输出样例:
    8 7 7 3 2 9

    定义

    e[N]:存放结点的val
    l[N]:存放结点的左边值
    r[N]:存放结点的右边值
    idx:索引结点

    初始化

    让0的右边为1,一的左边为0,即让头指针表示为0,让尾指针表示为1,则index从2开始。

    void init()
    {
        r[0] = 1;
        l[1] = 0;
        idx = 2;
    }
    

    insert操作

    题目中的各种insert操作:我们可以让它们都转化成插入在一个结点的右边(通过传入参数控制)。

    void insert(int k, int x)
    {
        e[idx] = x; 
        r[idx] = r[k]; //新插入结点的右边指向第k个结点的右边结点
        l[idx] = k; //新插入结点的左边指向第k个结点
        l[r[k]] = idx; //第k个结点的右边结点的左边指向新插入结点
        r[k] = idx; //第k个结点的右边指向新插入结点
        idx++;
    }
    

    删除操作

    void remove(int k)
    {
        r[l[k]] = r[k];  //k的左边结点的右边指向k的右边
        l[r[k]] = l[k];  //k的右边结点的左边指向k的左边
    }
    

    总代码

    注意插入时传参(因为idx从2开始,所以第k个结点的下标时k+1):

    #include <iostream>
    #include <string>
    using namespace std;
    
    const int N = 100010;
    int e[N], l[N], r[N], idx; 
    
    void init()
    {
        r[0] = 1;
        l[1] = 0;
        idx = 2;
    }
    
    void insert(int k, int x)
    {
        e[idx] = x;
        r[idx] = r[k];
        l[idx] = k;
        l[r[k]] = idx;
        r[k] = idx;
        idx++;
    }
    
    void remove(int k)
    {
        r[l[k]] = r[k];  //k的左边结点的右边指向k的右边
        l[r[k]] = l[k];  //k的右边结点的左边指向k的左边
    }
    
    int main()
    {
        int m;
    
        init();
    
        cin >> m;
        while(m--)
        {
            string op;
            cin >> op;
            int k, x;
    
            if(op == "L")
            {
                cin >> x;
                insert(0, x);
            }
            else if(op == "R")
            {
                cin >> x;
                insert(l[1], x);
            }
            else if(op == "D")
            {
                cin >> k;
                remove(k+1);  //因为idx = 2是第一个结点 所以第k个结点时k+1
            }
            else if(op == "IL")
            {
                cin >> k >> x;
                insert(l[k+1], x);
            }
            else if(op == "IR")
            {
                cin >> k >> x;
                insert(k+1, x);
            }
        }
    
        for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << " ";
        cout << endl;
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    php备份数据库类分享
    nginx https配置后无法访问,可能防火墙在捣鬼
    linux服务器,svn认证失败,配置问题,防火墙等等
    为了解决linux配置Nginx 只能关闭防火墙才能访问的问题
    nginx 防火墙、权限问题
    思数云hadoop目录
    delete
    善用GIMP(Linux下的Photoshop),图像处理轻松又自由
    超赞干货!2016年新鲜出炉的20款网页开发工具推荐
    10款Web前端工具
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13411976.html
Copyright © 2011-2022 走看看