算法刷题笔记 双链表(C++实现)

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

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

    • 在最左侧插入一个数;
    • 在最右侧插入一个数;
    • 将第k个插入的数删除;
    • 在第k个插入的数左侧插入一个数;
    • 在第k个插入的数右侧插入一个数
  • 现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。

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

输入格式

  • 第一行包含整数M,表示操作次数。
  • 接下来M行,每行包含一个操作命令,操作命令可能为以下几种:
    • L x,表示在链表的最左端插入数x
    • R x,表示在链表的最右端插入数x
    • D k,表示将第k个插入的数删除。
    • IL k x,表示在第k个插入的数左侧插入一个数。
    • IR k x,表示在第k个插入的数右侧插入一个数。

输出格式

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

数据范围

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

基本思路

  • 双链表实际上就是对单链表的衍生。单链表中,每一个结点只需要存储自己的下一个结点的位置(通过下标或指针的方式)即可,但是双链表中的结点需要存储自己的上一个结点的位置。另外,双链表中往往不只有头指针,还有尾指针。
  • 和单链表的实现思路类似,出于效率考虑,我们并不会在每次新建一个链表结点时都使用C++中的new运算符创建一个新结点,而是开辟一个空间足够大的静态数组,来模拟单链表。链表中每一个结点存储的左右两个结点的位置也分别通过一个静态数组进行表示。本题的最大难点就是对于每一种操作,都需要考虑是否要分情况,是否要合并多种情况。

实现代码

#include <iostream>
using namespace std;const int N = 1e5 + 10;
int list[N];
int l[N], r[N];
int head = -1, tail = -1, current = 0;inline void insert_left(void)
{// 输入结点信息int x;cin >> x;// 创建一个新结点list[current] = x;l[current] = -1;r[current] = head;// 修改原先的首结点if(head != -1) l[head] = current;else tail = current;// 将新插入的结点设置为首结点,同时修改当前位置head = current;current ++;
}inline void insert_right(void)
{// 输入结点信息int x;cin >> x;// 创建一个新结点list[current] = x;l[current] = tail;r[current] = -1;// 修改原先的尾结点if(tail != -1) r[tail] = current;else head = current;// 将新插入的结点设置为尾结点,同时修改当前位置tail = current;current ++;
}inline void delete_k(void)
{//输入部分int k;cin >> k;// 第一种情况,即该结点不是首结点也不是尾结点if(head != k - 1 && tail != k - 1){// 找出该结点的前一个结点和后一个结点的下标int before = l[k - 1], after = r[k - 1];// 修改前一个结点的后一个元素下标和后一个结点的前一个元素下标r[before] = r[k - 1];l[after] = l[k - 1];}// 第二种情况,即该结点是首结点但是不是尾结点else if(head == k - 1 && tail != k - 1) {head = r[k - 1];l[head] = -1;}// 第三种情况,即该结点是尾结点但是不是首结点else if(tail == k - 1 && head != k - 1){tail = l[k - 1];r[tail] = -1;}// 第四种情况,该结点是链表中唯一结点else{head = -1;tail = -1;}
}inline void insert_before_k(void)
{int k;cin >> k;if(head == k - 1) insert_left();else{int x;cin >> x;// 找到第k个结点的前一个结点int before = l[k - 1];// 创建一个新的结点list[current] = x;l[current] = before;r[current] = k - 1;// 修改前一个结点的后指针r[before] = current;// 修改第k个结点的前指针l[k - 1] = current;// 修改当前指针current ++;}
}inline void insert_after_k(void)
{int k;cin >> k;if(tail == k - 1) insert_right();else{int x;cin >> x;// 找到第k个结点的后一个结点int after = r[k - 1];// 创建一个新的结点list[current] = x;l[current] = k - 1;r[current] = after;// 修改第k个结点的后指针r[k - 1] = current;// 修改后一个结点的前指针l[after] = current;// 修改当前指针current ++;}
}int main(void)
{// 输入操作次数int M;cin >> M;// 输入每一次的操作,并分情况讨论for(int i = 0; i < M; ++i){string operation;cin >> operation;if(operation == "L") insert_left();else if(operation == "R") insert_right();else if(operation == "D") delete_k();else if(operation == "IL") insert_before_k();else if(operation == "IR") insert_after_k();}// 循环输出整个链表while(head != -1){cout << list[head] << " ";head = r[head];}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费开源AI生产力工具:内置专属ChatGPT、一键智能处理图片和视频(擦除水印、卡通漫画、无损放大、插值补帧、智能修复、3D转制、上色修复、合成整理)

AI 生产力工具 免费开源&#xff0c;提升用户生产力&#xff0c;保障隐私和数据安全。提供高效便捷的AI解决方案&#xff0c;包括但不限于&#xff1a;内置专属ChatGPT、一键批量智能处理图片和视频等。 主要特点 免费开源&#xff1a;免费使用&#xff0c;源代码开放&#…

odoo 安装/升级/卸载调用方法

原生升级/卸载 调用的方法记录 安装模块 button_immediate_install()升级模块 button_immediate_upgrade()卸载模块 button_immediate_uninstall()shell语句 安装/升级/卸载

大数据面试题之Spark(3)

目录 Spark的哪些算子会有shuffle过程? Spark有了RDD&#xff0c;为什么还要有Dataform和DataSet? Spark的RDD、DataFrame、DataSet、DataStream区别? Spark的Job、Stage、Task分别介绍下&#xff0c;如何划分? Application、job、Stage、task之间的关系 Stage内部逻辑…

性价比高真无线蓝牙耳机有哪些?性价比真无线蓝牙耳机推荐

目前真无线蓝牙耳机的音质和性能已经越来越接近甚至超越传统有线耳机。然而&#xff0c;市面上的TWS耳机品牌和型号繁多&#xff0c;价格也从几十元到几千元不等&#xff0c;性价比自然成了消费者选择时的重要考量因素&#xff0c;究竟哪些真无线蓝牙耳机既能够提供满意的音质和…

【408考点之数据结构】顺序查找和折半查找

顺序查找和折半查找 在数据处理中&#xff0c;查找操作是非常重要的一部分。顺序查找和折半查找是两种常见的查找方法&#xff0c;它们各有优缺点和适用场景。以下是对这两种查找方法的详细介绍。 1. 顺序查找 定义&#xff1a;顺序查找&#xff08;Sequential Search&#…

前沿重器[52] | 聊聊搜索系统5:召回:检索、粗排、多路召回

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

大数据的魔方:Kylin Cube构建全解析

&#x1f4d8; 大数据的魔方&#xff1a;Kylin Cube构建全解析 在大数据的浩瀚海洋中&#xff0c;Apache Kylin以其卓越的分析能力&#xff0c;为企业提供了一个强大的数据立方体&#xff08;Cube&#xff09;解决方案。Cube作为Kylin的核心概念之一&#xff0c;它的构建过程直…

C++Primer Plus 第十四章代码重用:总结

CPrimer Plus 第十四章代码重用&#xff1a;总结 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;CPrimer Plus 第十四章代码重用&#xff1a;总结 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff…

怎么把别人git项目保存为自己的

怎么把别人git项目保存为自己的 1.操作笔记1.1 先在自己的Git仓库里,把别人的项目克隆到本地。然后打开Git Bash或者其他的终端工具,然后使用以下命令克隆项目:1.2. 进入到本地仓库中,修改远程仓库的地址,将其指向自己的Git仓库。进入到项目的目录中,然后执行以下命令:1…

Windows定时任务执行脚本

场景&#xff1a;由于网络波动原因导致云数据库没连接上&#xff0c;从而导致某个流程引擎链接不上数据库从而导致该流程引擎服务挂了&#xff0c;网络恢复后 数据库链接正常&#xff0c;但是该引擎服务还是中止状态。 解决方案&#xff1a;在Windows中新建一个定时任务&#…

为用户转出并处理MODIS NDVI数据案例过程记述,希望对大家有用!

最近为用户转出和处理了一次MODIS NDVI数据&#xff0c;我将过程做了个总结供大家参考&#xff01;希望能帮助到一些下载和处理数据的朋友! 使用工具为三个&#xff1a;地图资源工具 和 GIS数据转换器-栅格&#xff0c;qgis。 1.选择【数据下载功能】&#xff0c;然后选择MO…

狄克斯特拉算法

狄克斯特拉算法&#xff08;Dijkstra’s algorithm&#xff09;是一种用于在带权图中找到从单一源点到所有其他顶点的最短路径的算法。它适用于处理带有非负权值的图。 下面将详细解释算法的工作原理、时间复杂度以及如何通过优化数据结构来改进其性能。 狄克斯特拉算法的工作…

复制 pdf 的表格到 markdown 版本的Typora 或者 word 中

在 pdf 中选中复制表格内容&#xff0c;直接粘贴到 typora 中失败&#xff0c;可以使用 txt文件和 excel 做过渡。 准备一个空的 txt 文件&#xff0c;将 pdf 中表格的数据复制粘贴到txt文件中&#xff0c;文本内容会以空格分开&#xff0c;如下图的形式&#xff1a; 打开 exc…

Android Gradle 开发与应用-Gradle基础

Gradle 是一个基于 Groovy 和 Kotlin DSL&#xff08;领域特定语言&#xff09;的构建自动化工具&#xff0c;特别适合用于大型项目的自动化构建。它广泛用于 Android 开发&#xff0c;因为它的灵活性和强大的依赖管理能力。下面是 Gradle 的基础介绍&#xff0c;特别是针对 An…

firewalld防火墙转发流量到其他端口forward port rules

假设云主机eth0: 47.93.27.106 tun0: inet 10.8.0.1 netmask 255.255.255.0 Show rules for a specific zone (public) sudo firewall-cmd --zonepublic --list-all Add the tun0 interface to the public zone: sudo firewall-cmd --zonepublic --add-interfacetun0 --…

手把手教你考下39张免费亚马逊AWS证书和学习徽章

小李哥目前共考了39项亚马逊云(AWS)徽章&#xff0c;这也是普通用户可考的全部徽章。这篇文章会介绍如何报名、复习、通过这39张徽章提升云计算基本技能&#xff0c;了解全球第一大云厂亚马逊云科技前沿技术。这篇文章在领英爆&#x1f525;&#xff0c;有将近100k浏览量和11k的…

MeterSphere v3.0全新启航,让软件测试工作更简单、更高效

2024年7月1日&#xff0c;MeterSphere v3.0版本正式发布。MeterSphere v3.0是新一代的测试管理和接口测试工具&#xff0c;致力于让软件测试工作更简单、更高效&#xff0c;不再成为持续交付的瓶颈。 在团队协作方面&#xff0c;针对目前企业软件测试团队所面临的测试工具不统…

Java中使用KMP算法解决力扣459.重复的子字符串问题

在解决字符串相关问题时&#xff0c;KMP&#xff08;Knuth-Morris-Pratt&#xff09;算法是一个非常有用的工具。今天&#xff0c;我们将使用KMP算法来解决力扣&#xff08;LeetCode&#xff09;上的一个经典问题&#xff1a;459. 重复的子字符串。 力扣459.重复的子字符串 题…

终止线程的典型方式

终止线程一般不使用JDK提供的 stop()/destory() 方法它们本身也被JDK废弃了。通常的做法是提供一个boolean型的终止变量&#xff0c;当这个变量置为false&#xff0c;则终止线程的运行。 public class stopThread implements Runnable {private boolean flag true;Overridepu…

数据安全与隐私保护在返利App中的实施策略

数据安全与隐私保护在返利App中的实施策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 随着移动互联网的发展&#xff0c;返利App作为一种流行的…