双链表(数组模拟)
双链表(数组模拟)
- 什么是双链表
- 数组模拟双链表
- 题目
什么是双链表
双链表不同于单链表的是 每一个节点不但存储了下一个节点的位置,也存储了上一个节点的位置。
数组模拟双链表
所以如果用数组的话,就需要创建三个数组。
题目
实现一个双链表,双链表初始为空,支持 5 5 5 种操作:
- 在最左侧插入一个数;
- 在最右侧插入一个数;
- 将第 k k k 个插入的数删除;
- 在第 k k k 个插入的数左侧插入一个数;
- 在第 k k k 个插入的数右侧插入一个数
现在要对该链表进行 M M M 次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第 k k k 个插入的数并不是指当前链表的第 k k k 个数。例如操作过程中一共插入了 n n n 个数,则按照插入的时间顺序,这 n n n 个数依次为:第 1 1 1 个插入的数,第 2 2 2 个插入的数,…第 n n n 个插入的数。
输入格式
第一行包含整数 M M M,表示操作次数。
接下来 M M M 行,每行包含一个操作命令,操作命令可能为以下几种:
L x,表示在链表的最左端插入数 x x x。R x,表示在链表的最右端插入数 x x x。D k,表示将第 k k k 个插入的数删除。IL k x,表示在第 k k k 个插入的数左侧插入一个数。IR k x,表示在第 k k k 个插入的数右侧插入一个数。
输出格式
共一行,将整个链表从左到右输出。
数据范围
1 ≤ M ≤ 100000 1 \le M \le 100000 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 用于存储 元素的值,数组 l 存储上一个节点的位置(下标),数组 r 存储下一个节点的位置。
idx 是 下一次即将要用到的 点。
对于双链表来说,虽然题目中有5中操作,但是只需要写两个函数就可以了。(不包含初始化函数)
初始化函数:

在用数组模拟双链表时,我们可以规定数组的前两个点分别指向 链表的头和尾,由于刚开始没有节点。
所以让他们互相指向对方,由于前面用了两个点,所以直接 让 idx = 2.
在 k 位置 后插入 一个新节点 的函数:

模拟代码过程:

e[ idx ] = x;

l[ idx ] = k;

r[ idx ] = r[ k ];

l[ r [ k ] ] = idx;

r[ k ] = idx;

最后自增 idx。
删除 下标为 k 的 数 的函数:

r[ l[ k ] ] = r [ k ];

l [ r [ k ] ] = l [ k ];

本题目当中的五种操作都可以转换该两种函数。

输入m,然后循环输入m次,记得写初始化函数。

因为用scanf读取字符会读取空格或换行符,而%s不会读取这些符号,所以会方便很多
题目的五个操作:

0下标是一个没有存值(数组e里面没有值,数组 l 有值)的头坐标,所以在下标0的右面插入一个值相当于在整个链表左边插入一个值。

1下标记录着链表最右边的位置,l [ 1 ] 则代表链表中最右边的点的位置,所以在 l [ 1 ] 后面插入相当于在链表的 最右边插入一个值。

这里唯一注意的点就是 传的实参是 k + 1,而不是k ,因为已经用过两个点了。所以插入的第一个数的下标就是从2开始的,以此类推。


如果我们想要在 k 位置的左边插入一个节点,那么相当于在 k 的左边节点的右侧插入一个节点。

那么在右侧就直接调用函数即可。
最后输出整个链表即可

完整代码如下:
#include <iostream>
#include <cstring>
using namespace std;const int N = 1e5+10;int e[N], l[N], r[N];
int idx;void init()
{r[0] = 1;l[1] = 0;idx = 2;
}//在 k 下标后插入一个数
void insert(int k, int x)
{e[idx] = x;l[idx] = k;r[idx] = r[k];l[r[k]] = idx;r[k] = idx;idx++;
}//删除下标为 k 的节点
void remove(int k)
{r[l[k]] = r[k];l[r[k]] = l[k];
}int main()
{init();int m;scanf("%d", &m);while (m--){char op[5];int k, x;scanf("%s", op);if (op[0] == 'L')//链表最左端插入一个数{scanf("%d", &x);insert(0, x);}else if (op[0] == 'R')//链表最右端插入一个数{scanf("%d", &x);insert(l[1], x);}else if (op[0] == 'D')//将插入的第K个数删除{scanf("%d", &k);remove(k + 1);//数组刚开始会用掉两个点,//那么插入的第一个数下标就为2,所以插入的第k个数就是下标就是k+1.}else if (strcmp(op, "IL") == 0){scanf("%d%d", &k, &x);insert(l[k+1], x); }else {scanf("%d%d", &k, &x);insert(k+1, x);}}for (int i = r[0]; i != 1; i = r[i]) printf("%d ", e[i]);return 0;
}
完
相关文章:
双链表(数组模拟)
双链表(数组模拟) 什么是双链表数组模拟双链表题目 什么是双链表 双链表不同于单链表的是 每一个节点不但存储了下一个节点的位置,也存储了上一个节点的位置。 数组模拟双链表 所以如果用数组的话,就需要创建三个数组。 题目 …...
ChatGPT 5.0:一年半后的展望与看法
在人工智能领域,每一次技术的飞跃都预示着未来生活与工作方式的深刻变革。随着OpenAI在人工智能领域的不断探索与突破,ChatGPT系列模型已成为全球关注的焦点。当谈及ChatGPT 5.0在未来一年半后可能发布的前景时,我们不禁充满期待,…...
城市地下综合管廊物联网远程监控
城市地下综合管廊物联网远程监控 城市地下综合管廊,作为现代都市基础设施的重要组成部分,其物联网远程监控系统的构建是实现智慧城市建设的关键环节。这一系统集成了先进的信息技术、传感器技术、通信技术和数据处理技术,旨在对埋设于地下的…...
VS 附加进程调试
背景: 此方式适合VS、代码和待调试的exe在同一台机器上。 一、还原代码到和正在跑的exe同版本 此操作可以保证能够调试生产环境的exe 二、设置符号路径 1.调试->选项 三、附加进程 方式1: 打开VS,调试->附加到进程,出…...
核函数的深入理解
核函数 (Kernel Function)是一种在高维特征空间中隐式计算内积的方法,它允许在原始低维空间中通过一个简单的函数来实现高维空间中的内积计算,而无需显式地计算高维特征向量。 核函数 的基本思想是通过一个映射函数 ϕ \phi ϕ …...
使用Ckman部署ClickHouse集群介绍
使用Ckman部署ClickHouse集群介绍 1. Ckman简介 ClickHouse Manager是一个为ClickHouse数据库量身定制的管理工具,它是由擎创科技数据库团队主导研发的一款用来管理和监控ClickHouse集群的可视化运维工具。目前该工具已在github上开源,开源地址为&…...
「前端工具」postman接口测试工具详解
Postman 是一款流行的 API 开发工具,用于构建和测试 RESTful API。以下是 Postman 的一些关键特性和使用方法的详解: 1. 界面和基本操作 工作区:Postman 的主界面,用于显示集合、环境和全局变量。请求构建器:用于输入请求的 URL、HTTP 方法、请求头、请求体等。响应区:显…...
生成requirements.txt
pip install pipreqs pipreqs ./ --encodingutf-8 --force python导出requirements.txt的几种方法总结...
ubuntu ceph部署
ubuntu ceph部署 参考文档:http://docs.ceph.org.cn/start/ 节点配置 1个mon节点,3个osd节点 安装前准备 安装ceph-deploy 添加 release key wget -q -O- https://download.ceph.com/keys/release.asc | sudo apt-key add -添加Ceph软件包源&…...
2024.7.8
2024.7.8 【追逐影子的人,自己就是影子 —— 荷马】 Monday 六月初三 讲的根本听不懂好吧! 目前只写了三道题(但是黑色 确实是没见过这么抽象的数据结构 Gregor and the Two Painters Number of Components Equal LCM Subsets 这个lcm确实…...
Spring 外部jar包Bean自动装配
Spring 外部jar包Bean自动装配 背景介绍 公共代码模块被作为jar包引入业务项目,前者定义的bean即使添加了Component注解由于不会被扫描到也就无法被Spring管理。此处通过Spring SPI机制来完成 使用 spring.factories 在外部 jar 包中创建 spring.factories 文件&a…...
2通道音频ADC解码芯片ES7243L、ES7243E、ES7243,用于低成本实现模拟麦克风转换为IIS数字话筒
前言: 音频解码芯片某创参考价格: ES7243L 500:¥1.36 / 个 ES7243E 500:¥1.66 / 个 ES7243 500: ¥1.91 / 个 其中ES7243L工作电压为1.8V,与其他两款的3.3V工作电压不同&…...
uniapp跨域问题解决
找到menifest文件,在文件的最后添加如下代码: // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…...
[C++][ProtoBuf][Proto3语法][一]详细讲解
目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则 消息的字段可以⽤下⾯⼏种规则来修饰: singular:消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中,字段默认使⽤该规则 repeat…...
千古雄文《渔樵问对》原文、译文、解析
邵雍《渔樵问对》:开悟奇文,揭示世界的终极意义 【邵雍《渔樵问对》:开悟奇文,揭示世界的终极意义】 邵雍(1011年1月21日-1077年7月27日,宋真宗大中祥符四年十二月二十五日戌时生至神宗熙宁十…...
uniapp 开发备忘录-防坑指南
uniapp 开发备忘录-防坑指南 npm run dev:mp-weixin 编译微信小程序报错: [plugin:uni:mp-using-component] Expected ‘,’ or ‘}’ after property value in JSON at position 解决方案:升级uniapp 到最新 alpha 版。(2024年7月13日&am…...
Simple_ReAct_Agent
参考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph,以下为代码的实现。 Basic ReAct Agent(manual action) import openai import re import httpx import os from dotenv import load_dotenv, find_dotenvOPENAI_API_KEY os.getenv(OPEN…...
window wsl安装ubuntu
文章目录 wsl安装ubuntu什么是wsl安装wsl检查运行 WSL 2 的要求将 WSL 2 设置为默认版本查看并安装linux WSL2的使用如何查看linux文件wsl如何使用代理:方法1:方法2:通过 DNS 隧道来配置 WSL 的网络 如何将 WSL 接入局域网并与宿主机同网段使用VScode连接…...
postmessage()在同一域名下,传递消息给另一个页面
这里是同域名下,getmessage.html(发送信息)传递消息给index.html(收到信息,并回传收到信息) index.html页面 <!DOCTYPE html> <html><head><meta http-equiv"content-type"…...
初始redis:在Ubuntu上安装redis
1.先切换到root用户 使用su命令切换到root 2.使用apt命令来搜索redis相关的软件包 命令:apt search redis 3.下载redis 命令: apt install redis 在Ubuntu 20.04中 ,下载的redis版本是redis5 4.查看redis状态 命令: netst…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
[特殊字符] Spring Boot底层原理深度解析与高级面试题精析
一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配,通过简化传统Spring应用的初始化和配置流程,显著提升开发效率。其底层原理可拆解为以下核心机制: 自动装配(Auto-Configuration) 核…...
LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...
