• 数组实现单链表


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

    (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)。

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

    数据范围
    1≤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

    定义:

    head为头指针

    e[N]存放结点的val

    ne[N]存放结点的next指针

    idx表示第n个插入的结点

    初始化:head为-1,idex为0

    void init()
    {
        head = -1;
        idx = 0;
    }
    

    向链表头插入一个数:

    void add_to_head(int x)
    {
        e[idx] = x;
        ne[idx] = head;
        head = idx;
        idx++;
    }
    

    第k个插入的数后插入一个数

    void add(int k, int x)
    {
        e[idx] = x;
        ne[idx] = ne[k];
        ne[k] = idx;
        idx++;
    }
    

    删除:

    (1)删除第一个结点: head = ne[head]

    (2)删除任意一个结点:

    void remove(int k)
    {
        ne[k] = ne[ne[k]];
    }
    

    还要注意,这里因为我们的下标从0开始,所以我们第k的结点下标实际上是k-1。

    代码

    #include <iostream>
    using namespace std;
    
    const int N = 100010;
    int head, e[N], ne[N], idx;
    
    void init()
    {
        head = -1;
        idx = 0;
    }
    
    void add_to_head(int x)
    {
        e[idx] = x;
        ne[idx] = head;
        head = idx;
        idx++;
    }
    
    void add(int k, int x)
    {
        e[idx] = x;
        ne[idx] = ne[k];
        ne[k] = idx;
        idx++;
    }
    
    void remove(int k)
    {
        ne[k] = ne[ne[k]];
    }
    
    int main()
    {
        int m;
    
        cin >> m;
    
        init();
    
        while(m--)
        {
            int k, x;
            char op;
    
            cin >> op;
            if(op == 'H')
            {
                cin >> x;
                add_to_head(x);
            }
            else if(op == 'D')
            {
                cin >> k;
                if(!k) head = ne[head]; //如果删除的师第一个结点
                else remove(k-1);
            }
            else
            {
                cin >> k >> x;
                add(k-1, x);
            }
        }
    
        for(int i = head; i != -1; i = ne[i]) cout << i << " ";
        cout << endl;
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    Yii常用路径说明
    PHP-redis中文文档
    PHP 判断客户端是IOS还是Android
    yiii 框架登录 判断是否是游客模式及未登录状态
    php实现数字格式化,数字每三位加逗号的功能函数
    php array_udiff_uassoc比较数组的键值与值
    php--数组函数array
    安装Postman
    vue指令
    vue 错误记录
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13406285.html
Copyright © 2020-2023  润新知