当前位置: 首页 > article >正文

数据结构与算法学习笔记----链表

数据结构与算法学习笔记----链表

@@ author: 明月清了个风

@@ last edited: 2024.11.21

Acwing 826. 单链表

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

  1. 向链表头插入一个数;
  2. 删除第 k k k个插入的数后面一个数
  3. 在第 k k k个插入的数后插入一个数

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

注意:题目中第 k k k个插入的数并不是指当前链表的第 k k k个数,而是按插入顺序的第 k k k个数

输入格式

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

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

  1. H x表示向链表头插入一个数 x x x
  2. D k,表示删除第 k k k个插入的数后面的数(当 k k k为0时,表示删除头结点)
  3. I k x,表示在第 k k k个插入的数后面插入一个数 x x x(此操作中 k k k均大于0)

输出格式

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

数据范围

1 ≤ M ≤ 1 0 5 1 \leq M \leq 10^{5} 1M105,

代码

#include <iostream>

using namespace std;

const int N = 100010;

int head, idx;
int e[N], ne[N];

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

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

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

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

int main()
{
    init();
    
    int n;
    cin >> n;
    
    while(n --)
    {
        int k, x;
        char op;
        cin >> op;
        
        if(op == 'H')
        {
            cin >> x;
            add_to_head(x);
        } 
        else if(op == 'I')
        {
            cin >> k >> x;
            add(k -1, x);
        } 
        else
        {
            cin >> k;
            if(!k) head = ne[head];
            else del(k - 1);
        }
    }
    
    for(int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
    
    return 0;
    
}

Acwing 827. 双链表

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

  1. 在最左侧插入一个数;
  2. 在最右侧插入一个数;
  3. 将第 k k k 个插入的数删除;
  4. 在第 k k k个插入的数左侧插入一个数
  5. 在第 k k k个插入的数右侧插入一个数

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

注意:题目中第 k k k个插入的数并不是指当前链表的第 k k k个数,而是按插入顺序的第 k k k个数

输入格式

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

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

  1. L x表示在链表的最左端插入数 x x x
  2. R x表示在链表的最右端插入数 x x x
  3. D k,表示将第 k k k 个插入的数删除。
  4. IL k x,表示在第 k k k个插入的数左侧插入一个数 x x x
  5. IR k x,表示在第 k k k个插入的数右侧插入一个数 x x x

输出格式

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

数据范围

1 ≤ M ≤ 1 0 5 1 \leq M \leq 10^{5} 1M105,

代码

#include <iostream>

using namespace std;

const int N = 100010;

int n;
int r[N], l[N], e[N], idx;

void insert(int k, int x)
{
    e[idx] = x;
    l[idx] = k, r[idx] = r[k];
    l[r[k]] = idx, r[k] = idx ++;
}

void del(int k)
{
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}


int main()
{
    int m;
    cin >> m;
    
    r[0] = 1, l[1] = 0;
    idx = 2;
    
    while(m --)
    {
        int k, x;
        string op;
        cin >> op;
        
        if(op == "L")
        {
            cin >> x;
            insert(0, x);
        }
        else if(op == "R")
        {
            cin >> x;
            insert(l[1], x);
        }
        else if(op == "D")
        {
            cin >> k;
            del(k + 1);
        }
        else if(op == "IL")
        {
            cin >> k >> x;
            insert(l[k + 1], x);
        }
        else
        {
            cin >> k >> x;
            insert(k + 1, x);
        }
    }
    
    for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
    
    return 0;
}

http://www.kler.cn/a/408619.html

相关文章:

  • 全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发
  • 非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2
  • uni-app 界面TabBar中间大图标设置的两种方法
  • HTML5好看的音乐播放器多种风格(附源码)
  • 【时时三省】NIT计算机考试基础知识
  • 基于STM32的火灾报警装置的Proteus仿真
  • 《深入浅出HTTPS​​​​​​​​​​》读书笔记(10):流密码算法
  • 【5】STM32·FreeRTOS·临界段保护与调度器挂起
  • TCP三次握手的过程是怎样的?
  • 嵌入式开发 “微观世界”:位、字、字节、字符的精细解读与实战关联
  • Image fusion meets deep learning: A survey and perspective译文
  • 神经网络10-Temporal Fusion Transformer (TFT)
  • 【大语言模型】ACL2024论文-18 MINPROMPT:基于图的最小提示数据增强用于少样本问答
  • 《探索 C++:一门强大且多功能的编程语言》
  • 【Mac】VMware Fusion Pro 安装 CentOS 7
  • 深度解析MyBatis增删查改(XML方式):快速掌握数据库操作
  • Linux基本指令【Linux系统】
  • ftdi_sio应用学习笔记 5 - SPI
  • Spring Security @PreAuthorize注解
  • Ubuntu20.04安装ROS1
  • 微信小程序被攻击怎么选择高防产品
  • 如何通过docker容器将ASP.NET Core站点部署到CentOS
  • 【python系列】python数据类型之字典
  • Vue (一)
  • Linux笔记---进程:进程切换与O(1)调度算法
  • 微前端+qiankun