数组模拟双链表-java

通过数组来模拟双链表,并执行一些插入和删除的功能。

目录

一、问题描述

二、模拟思路

1.变量解释

2.数组初始化

3.在下标是k的结点后面插入一个结点

4.删除下标为k的结点

5.基本功能解释

三、代码如下

1.代码如下:

2.读入数据:

3.代码运行结果如下:

总结


前言

通过数组来模拟双链表,并执行一些插入和删除的功能。


一、问题描述

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

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

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

注意:题目中第 k个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n个数依次为:第 1 个插入的数,第 22个插入的数,…第 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
所有操作保证合法。

二、模拟思路

1.变量解释

 图1.1样例图

我们引入一维整型数组e,用来存储结点的值;一维整型数组l,用来记录当前结点指向左边结点的索引值;一维整型数组r,用来记录当前结点指向的右边结点的索引值;整型变量index用来表示数组e中第一个空结点的索引值,即创建新结点的索引值。

2.数组初始化

图2.1样例图 

 我们进行初始化操作将索引0和索引1的结点直接占用,分别表示头结点和尾结点,让头结点的右指针指向尾结点,然后让尾结点的左指针指向头结点,第一个空结点从索引为2的结点开始。

    //初始化public static void init(){r[0] = 1;l[1] = 0;index = 2;}

3.在下标是k的结点后面插入一个结点

图3.1 

 我们传入下标k和结点的值x,我们先让结点存入链表,即e[index] = x。然后我们需要让新插入的结点的右指针指向下标为k指向的右节点;新插入的结点的右指针为r[index],下标为k的结点指向的右节点为r[k],即r[index] = r[k];让新插入的结点的左指针指向下标为k的结点即l[index] = k;让下标为k的结点指向的右结点的左指针指向新插入的结点,让下标为k的结点指向的右结点的左指针为l[r[k]],即l[r[k]] = index;再让下标为k的结点指向的右指针指向新结点即r[k] = index;此时我们就完成了将新结点插入整个链表。切记因为进行这一系列操作我们需要记录下标为k的结点的下一个结点即r[k],如果我们先修改这个值,那么后面再用就会发生变化,所以要么用变量先存储,要么r[k]我们先用,修改的操作最后进行,这样不容易发生错误。

最后将index++,让index一直保持是第一个空结点的下标。

4.删除下标为k的结点

图4.1思路模拟 

我们删除下标为k的结点 ,即直接让下标为k的前一个结点的右指针指向下标为k的结点的后一个结点,让下标为k的结点的后一个结点的左指针指向下标为k的的结点的前一个结点即可。下标为k的前一个结点为l[k],下标为k的后一个结点为r[k],我们完场上述两个操作是r[l[k]] = r[k]、l[r[k]] = l[k],这样我们就完成了删除下标为k的结点的操作。

    //删除下标为k的结点public static void delete(int k){r[l[k]] = r[k];l[r[k]] = l[k];}

5.基本功能解释

 在最左则插入一个结点就是在下标为0的点的右边插入一个结点,即是add(0,x);在最右侧添加一个结点就是在尾结点的前一个结点的后面添加一个结点,即add(l[1],x);将第 k 个插入的结点删除,我们第1个插入的结点是在索引2的位置,那么我们第k个插入的结点就是在索引为k+1的位置,那么该操作为delete(k+1);在第 k 个插入的数左侧插入一个结点,即是在下标为k+1的左边的结点的后面插入一个数即add(l[k+1],x);在第 k个插入的数右侧插入一个结点,就直接在下标为k+1的结点后面插入一个结点即add(k+1,x)。

三、代码如下

1.代码如下:


import java.io.*;
import java.util.*;
public class 双链表 {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static int N = 100010;//存储结点的值static int[] e = new int[N];//存储结点连接的左节点索引static int[] l = new int[N];//存储结点连接的右节点索引static int[] r = new int[N];//数组e中第一个空结点的索引static int index;public static void main(String[] args) {Scanner sc = new Scanner(br);int m = Integer.parseInt(sc.nextLine());init();while (m-- > 0){String[] str = sc.nextLine().split(" ");String cmd = str[0];int k,x;//最左边插入,即在下标为0的结点右边插入if(cmd.equals("L")){x = Integer.parseInt(str[1]);add(0,x);}//最右边插入,即尾结点1的左指针指向的结点的右边插入else if (cmd.equals("R")) {x = Integer.parseInt(str[1]);add(l[1],x);}else if (cmd.equals("D")) {k = Integer.parseInt(str[1]);delete(k+1);} else if (cmd.equals("IL")) {k = Integer.parseInt(str[1]);x = Integer.parseInt(str[2]);add(l[k+1],x);}else if(cmd.equals("IR")) {k = Integer.parseInt(str[1]);x = Integer.parseInt(str[2]);add(k+1,x);}}for(int i = r[0];i !=1;i = r[i]){pw.print(e[i]+" ");}pw.flush();}//初始化public static void init(){r[0] = 1;l[1] = 0;index = 2;}//在下标是k的右边插入一个点public static void add(int k,int x){e[index] = x;r[index] = r[k];l[index] = k;l[r[k]] = index;r[k] = index;index++;}//删除下标为k的结点public static void delete(int k){r[l[k]] = r[k];l[r[k]] = l[k];}
}

2.读入数据:

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

3.代码运行结果如下:

8 7 7 3 2 9

总结

当我们刷算法题时可以通过数组来模拟链表,比直接用结构体的代码会简洁一点。

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

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

相关文章

【海博】雅思考什么?

文章目录 听力 阅读 写作 口语 参考资料 听力 听力考试分为四个部分,每个部分有10道题,每题1分。问题的排列顺序和答案在听力材料中出现的顺序一致。在播放听力材料过程中,考生会获得读题、写下答案以及检查答案的时间。考生应在播放听力…

Memory augment is All You Need for image restoration 论文翻译

目录 一.介绍 二.实际工作 A.图像阴影去除 B.图像去雨 C.存储模块的开发 三.网络结构 A.内存扩充 B.损失函数设计 四.实验 A.与最先进方法的比较 B.MemoryNet消融研究 五.结论 CVPR2023 MemoryNet 记忆增强是图像恢复所需要的一切 论文地址https://arxiv.org/abs/…

代码随想录算法训练营DAY47|C++动态规划Part8|198.打家劫舍、213.打家劫舍II、198.打家劫舍III

文章目录 198.打家劫舍思路CPP代码 213.打家劫舍II解决环的问题思路总结CPP代码 198.打家劫舍III思路递归三部曲——确定参数和返回值递归三部曲——确定终止条件递归三部曲——确定单层遍历的逻辑 打印dp数组CPP代码 198.打家劫舍 力扣题目链接 文章讲解:198.打家劫…

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

Linux 第十七章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

刷机维修进阶教程-----VIVO机型 修复基带 更改参数 实例步骤操作解析

写到前面: 任何参数修改和刷写分区都有风险。严重会导致无基带 无信号等故障。操作前都需要谨慎,养成备份关键数据分区的习惯。以便出现问题可以恢复。不管是修复基带分区还是更改相关参数,在操作前都有可以恢复原分区数据与刷机救砖的能力在操作。今天以vivo机型来做演示。…

bun 换源 国内阿里源 npmmirror 加速下载

Github https://github.com/oven-sh/bun 版本号 bun 1.1.5 windows 安装 bun 如果本机有 nodejs 环境, 可以 npm install -g bun 安装 ( 官方把 exe 已经传到了 npm 仓库, 走的国内 npm 镜像, 下载速度会很快) 没有 nodejs, 可以用 powershell 脚本安装 具体操作 全局 …

力扣刷题 63.不同路径 II

题干 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上角到…

Pytorch GPU版本安装

一、背景 记录一下安装Pytorch GPU版本过程。 由于手残,卸载了电脑上的显卡驱动,现在我连显卡类型是啥都不知道了。 总体思路:安装显卡驱动->安装cuda->安装pytorch库 二、安装显卡驱动 2.1 查看本地显卡型号 通过「DirectX 诊断工具…

Leetcode 145:二叉树的后序遍历(迭代法)

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 思路: 迭代法的思路是,使用栈,一层一层的将树节点遍历入栈。 比如下面这个树,使用迭代法,1)第一层,让根节点入栈。2&a…

顺序表??

1.引入:首先需要了解数据结构的作用:是计算机存储、组织数据的方式。就比如之前学的数组,就是一种基础的数据结构。通过数组,就可以去维护很多个同类型的数据,实现增加删除等的功能,这样就可以有效管理这些…

嵌入式学习63-C++

知识零碎: newmalloc friend 友元函数 …

微搭低代码入门01微搭底层能力介绍

目录 1 什么是应用2 有服务器和无服务器3 关系型数据库和文档型数据库4 云存储5 云函数6 静态网站托管总结 日常经常解答初学者的问题,问的最多的就是学习微搭,需要多久,要不要学习代码。有的初学者心比较急躁,总是希望一蹴而就&a…

边循环边删除List中的数据

List边循环,边删除;这种一听感觉就像是会出问题一样,其实只要是删除特定数据,就不会出问题,你如果直接循环删除所有数据,那可能就会出问题了,比如: public static void main(String[…

一些优雅的监控运维技巧

准备工作 安装 sysstat sudo apt install sysstat查看某个进程的cpu情况 pidstst -u -p 256432查看某个进程的RAM情况 pidstst -r -p 256432查看某个进程的IO情况 pidstst -d -p 256432查看某个进程下的线程执行情况 pidstst -t -p 256432查看指定PID的进程对应的可执行文件…

C++协程库封装

操作系统&#xff1a;ubuntu20.04LTS 头文件&#xff1a;<ucontext.h> 什么是协程 协程可以看作轻量级线程&#xff0c;相比于线程&#xff0c;协程的调度完全由用户控制。可以理解为程序员可以暂停执行或恢复执行的函数。将每个线程看作是一个子程序&#xff0c;或者…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

蓝桥杯国赛填空题(弹珠堆放)

小蓝有 20230610 颗磁力弹珠&#xff0c;他对金字塔形状尤其感兴趣&#xff0c;如下图所示&#xff1a; 高度为 1 的金字塔需要 1 颗弹珠&#xff1b; 高度为 2 的金字塔需要 4 颗弹珠&#xff1b; 高度为 3 的金字塔需要 10 颗弹珠&#xff1b; 高度为 4 的金字塔需…

Python 语音识别系列-实战学习-语音识别特征提取

Python 语音识别系列-实战学习-语音识别特征提取 前言1.预加重、分帧和加窗2.提取特征3.可视化特征4.总结 前言 语音识别特征提取是语音处理中的一个重要环节&#xff0c;其主要任务是将连续的时域语音信号转换为连续的特征向量&#xff0c;以便于后续的语音识别和语音处理任务…

qt嵌入并控制外部程序

一、流程 1、调用Window接口模拟鼠标&#xff0c;键盘事件 POINT point; LPPOINT lpppoint &point; GetCursorPos(lpppoint);//获取鼠标位置 SetCursorPos(point.x, point.y);//设置鼠标位置//鼠标左键按下 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, poi…