Java 实现删除顺序表中第一次出现的某个元素

一、思路

1.顺序表不能是空的,如果顺序表是空的就肯定无法删除第一次出现的 key 元素.
2.定义一个key变量来传入要删除的元素,这个元素要求是第一次出现的.
3.删除之前要先找到第一次出现的key的下标.
4.找到位置之后就开始删除.
5.删除过程是从key下标位置的后一个位置开始向前覆盖.
6.覆盖结束后,将元素个数减少一个.

二、图解


以上图示展示出来的 key 所指向的位置就是要删除元素的位置。


下述图片展示出来就是删除之后的效果。


可以看到 45 这个元素原本是在 3 号下标,但是此时指向的却是 2 号下标。这是由于虽然是删除元素,但是为了保证顺序表的结构没有改变,删除操作实际上就是将后面的元素向前覆盖。



覆盖操作:

覆盖操作指的是将 i + 1 位置上的元素赋值给 i 位置上的元素。


首先要删除的元素就是 i 位置,后面一个位置就是 i + 1。

覆盖即是将 i + 1 位置上的元素放到 i 下标位置,此时原先 i 下标位置上的元素就不见了。


如果整个表都是空的,此时是不可能找到要删除的元素的。

三、代码

class EmptyException extends RuntimeException {
    
    
    public EmptyException() {
    
    
        //这是一个提示顺序表为空的异常
    }

    public EmptyException(String massage) {
    
    
        super(massage);
    }
}

// 求顺序表的长度
public int size() {
    
    
    // 直接返回元素个数
    return this.usedSize;
}

//查找 key 元素的位置 - toFind是我要查找的元素
public int indexOf (int toFind) {
    
    
    //size()方法求的是顺序表的长度
    for (int i = 0; i < this.size(); i++) {
    
    
        //若顺序表存储的是引用数据类型,该怎么比较?要使用 equals()来比较
        if (this.elem[i] == toFind) {
    
    
            return i; //找到了 - 返回下标
        }
    }
    return -1;//没找到 - 返回-1
}
    
// 删除第一次出现的 key 元素
public void remove(int key) {
    
    
    // 顺序表不能是空的
    if (isEmpty()) {
    
    
        // 此时顺序表为空
        throw new EmptyException("当前顺序表为空!!!");
    }

    // 调用 indexOf 方法查找 key 的位置
    int index = indexOf(key);

    // 判断此时 key 的下标是不是负数
    if (index == -1) {
    
    
        System.out.println("没有这个元素!!!");
        return;
    }

    // 循环遍历覆盖要删除的元素
    for (int i = index; i < this.usedSize - 1; i++) {
    
    
         this.elem[i] = this.elem[i + 1];
    }

    // 顺序表元素个数减少一个
    this.usedSize--;
}

public class MyArrayList {
    
    

    public static void main(String[] args) {
    
    
        ArrayList arrayList = new ArrayList();

        //测试在顺序表末尾插入一个元素的方法
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);

        // 测试在顺序表中指定位置插入一个元素
        try{
    
    
            arrayList.add(1, 10);//将1下标的位置插入一个10
        }catch (PosWrongfulException e){
    
     //包裹一下可能会抛出的异常
            e.printStackTrace();//如果有异常会提示
        }
        
        // 输出删除之前的顺序表
        arrayList.disPlay();
        System.out.println();

        // 测试删除第一次出现的 key 元素
        arrayList.remove(10);

        // 输出删除之后的顺序表
        arrayList.disPlay();  
    }
}



根据结果可以看到此时确实是删除了 10 这个元素。

猜你喜欢

转载自blog.csdn.net/m0_63033419/article/details/131078184