Java 实现在顺序表指定位置插入一个元素

news/2024/2/29 3:04:09

一、思路

1.定义一个pos变量来记录要插入的位置.
2.定义一个usedSize变量来记录元素个数.
3.定义一个data变量来记录要插入的元素值.
4.要保证pos位置合法,也就是不是负数,因为是要保证pos位置前是要有元素,因此也不能大于元素个数.
5.也需要考虑顺序表满了需要扩容的问题.
6.在开始插入之前,要将pos位置和它之后的所有元素向后位移一个位置,要注意的是是从末尾开始移动.
7.插入元素的时候直接将data赋值给pos下标.
8.插入成功后元素个数加1.


二、图解


当前 pos 指向的是 3 下标的位置,即要插入的位置是 3 下标的位置;data 是要插入的元素的值。

如果要在当前的 pos 位置插入一个元素,则需要将 4、5 这两个元素各向后移动一个位置。
需要注意的是要先移动 5,再移动 4,即先移动后面的位置,再移动前面的位置。

移动完成如下图。


接下来只需要将 data 元素的值赋值给 pos 下标即可。

插入完成的如下图。


位置不合法的情况


可以看到当前的 pos 位置不属于数组的范围,也就不可以插入到数组中。


因为要保证 pos 位置前是要有元素的,因此此时的情况也是不合法的一种。
在上述这种情况下如果插入元素,将 4、5 两个元素向后移动,在 pos 位置插入之后,pos 位置前的那一个位置(3 下标)就浪费掉了。

如果在移动元素的时候不是从末尾开始移动的比较不合理。


可以看到如果是在当前的 pos 位置插入元素,若此时不是从末尾位置移动,而是直接从 4 下标开始移动,会一次移动两个位置。效果如下图。


可以看到此时在 pos 位置插入一个元素后,会浪费掉一个空间;并且是每一次插入就会浪费掉一个空间。


三、代码

// 2.在顺序表指定位置插入一个元素public void add(int pos, int data) {// 先判断顺序表是不是满的if (isFull()) {// 满了 - 扩容System.out.println("顺序表满了!!!");this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);}// pos 位置要合法if (pos < 0 || pos > this.usedSize) {// 此时为不合法System.out.println("插入位置不合法!!!");throw new PosWrongfulException("位置不合法!!!");}// 开始插入前要将 pos 位置和他后面的元素向后移for (int i = this.usedSize - 1; i >= pos ; i--) {// 将前一个元素赋值给后一个this.elem[i + 1] = this.elem[i];}// 开始插入this.elem[pos] = data;// 元素个数加1this.usedSize++;}



上述图片是插入之前的顺序表元素,接下来在 1(元素2) 下标位置插入一个元素 10。


可以看到此时 10 元素就出现到了 1 下标的位置,并且顺序表的结构也没有乱。


https://www.jiucaihua.cn/news/show-4628043.html

相关文章

PyTorch深度学习实战(2)——PyTorch基础

PyTorch深度学习实战&#xff08;2&#xff09;——PyTorch基础 0. 前言1. 搭建 PyTorch 环境2. PyTorch 张量2.1 张量初始化2.2 张量运算2.3 张量对象的自动梯度计算 3. PyTorch 张量相对于 NumPy 数组的优势小结系列链接 0. 前言 PyTorch 是广泛应用于机器学习领域中的强大开…

Rust每日一练(Leetday0020) 最后单词的长度、螺旋矩阵II、排列序列

目录 58. 最后一个单词的长度 Length of Last Word &#x1f31f; 59. 螺旋矩阵 II Spiral Matrix II &#x1f31f;&#x1f31f; 60. 排列序列 Permutation Sequence &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日…

Linux之理解文件系统——文件的管理

文章目录 前言一、磁盘1.磁盘的物理结构2.磁盘的存储结构3.磁盘的逻辑结构 二、文件系统与inode1.文件在磁盘中是如何存储的&#xff1f;2.对文件进行操作 三、软硬链接1.软链接创建软链接&#xff1a;inode删除软链接&#xff1a;软链接的作用&#xff1a; 2.硬链接创建硬链接…

JavaScript之BOM(八)

JavaScript之BOM 1、BOM中的对象2、window对象2.1、简介2.2、常用的属性与方法2.3、常用的事件2.4、定时器和延时器 3、navigator 常用属性与方法4、history 常用属性与方法5、location 常用属性与方法 BOM&#xff1a;浏览器对象模型&#xff08;Browser Object Model&#xf…

阿里云 Windows Server 2022 安装 Docker

阿里云Windows Server 2022 安装 Docker 文章目录 情景尝试正解 安装Docker管理工具安装Docker重启系统配置Docker系统路径配置Docker引擎(也许不用)启动Docker服务 情景 情景&#xff1a;最近一直在搞微服务&#xff0c;团队的服务器是阿里云的 Windows Server 2022&…

论文笔记--Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

论文笔记--Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context 1. 文章简介2. 文章概括3 文章重点技术3.1 Segment-Level Recurrence with State Reuse3.2 相对位置编码 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Transformer-XL: Attent…

Golang每日一练(leetDay0086) 回文链表、删除链表节点

目录 234. 回文链表 Palindrome Linked-list &#x1f31f; 237. 删除链表中的节点 Delete Node In a Linked-list &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练…

MMPose(openmmlab AI实战营二期第一节)

链接&#xff1a;人体关键点检测与MMPose_哔哩哔哩_bilibili 赶了个进度&#xff0c;实际上没听到&#xff0c;一个方向被浓缩成50分钟是有点难度。后续有需要再回顾吧 人体姿态估计&#xff1a;识别人体关键点坐标。模式识别任务&#xff0c;难点是始终在变化。以关键点连线…

软件外包开发的测试用例

软件测试用例是一组详细的步骤、输入数据、预期结果和实际结果&#xff0c;用于验证软件是否满足特定需求或功能。编写测试用例的目的是确保软件的质量和性能。今天和大家分享编写软件测试用例的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;…

数据库关系操作集合

文章目录 传统集合运算1:联合&#xff08;UNION&#xff09;2:差集&#xff08;EXCEPT 或 MINUS 或 LEFT JOIN&&IS NULL&#xff09;3:交集&#xff08;INTERSECT或INNER JOIN&#xff09;4:笛卡尔积&#xff08;JOIN&#xff09; 专门集合运算1:选择&#xff08;SELEC…