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

news/2024/5/20 4:46:17 标签: java, 数据结构, intellij-idea, 顺序表

一、思路

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 位置插入一个元素后,会浪费掉一个空间;并且是每一次插入就会浪费掉一个空间。


三、代码

java">// 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;
        // 元素个数加1
        this.usedSize++;
    }



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


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


http://www.niftyadmin.cn/n/393605.html

相关文章

打电话用什么耳机好,推荐几款性能表现高的骨传导耳机

近几年有一种新型传播方式的耳机&#xff0c;将声音转化为振动&#xff0c;从而让我们的听觉神经感知到。这种声音传播方式叫做"骨传导"&#xff0c;所以叫做骨传导耳机。因为它不需要通过耳膜进行传播声音&#xff0c;所以可以让耳朵在不接触外界的情况下听到声音。…

chatgpt赋能python:Python可以搜集网上资料吗?

Python 可以搜集网上资料吗&#xff1f; Python 是一种非常流行的编程语言&#xff0c;它广泛应用于数据科学、机器学习、人工智能等领域。作为一名 Python 工程师&#xff0c;我们经常需要在互联网上搜集资料来解决开发中的问题&#xff0c;但是有些人会问&#xff1a;Python…

Python3内置关键字大全

目录 1. 布尔类 True 真 False 假 None 空 2. 逻辑类 and 与 or 或 not 非 3. 判断类 if 条件判断 elif 条件判断 else 条件判断 4. 循环类 for 迭代循环 while 判断循环 break 跳出整个循环 continue 跳出当前循环 5. 定义类 class 类与对象 def 自定义函…

基于 Linux 高性能内存池的 Mempoola 数据缓存队列设计

文章目录 本章内容概述一、项目背景二、项目架构1. 内存池分析2. 内存池设计 三、项目实现1. 链栈 StackAlloc2. 内存池 Mempoola成员变量和功能实现分配器构造函数分配器析构函数分配器分配内存函数分配器回收内存函数分配器构造内存函数分配器析构内存函数 本章总结 本章内容…

数据库关系操作集合

文章目录 传统集合运算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…

Zabbix(一)

介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 功能组件 Server &#xff1a; Zabbix server是zabbix软件的核心组件 Zabbix agent向其报告可用性、系统完整性和统计信息 Zabbix server存储所有的配置信息、统计信息和操作信…

【Linux网络编程】HTTPS协议原理

https协议原理 一、HTTPS是什么二、基本概念2.1、什么是加密2.2、为什么要加密 三、常见的加密方式四、数据摘要(指纹)&&数字签名五、HTTPS的工作过程探究方案&#xff08;1&#xff09;&#xff1a;只使用对称加密方案&#xff08;2&#xff09;&#xff1a;只使用非对…