Java实现顺序表的增删改查

public class MyArrayList {
    private int[] array;   //代表的是存在数据的数组
                           //array.length代表的是数组的容量
    private int size;        //记录顺序表的已有数据个数
    
    //构造方法
    public MyArrayList() {
        //1.申请空间
        array = new int[2];
        //2.初始化数据个数
        size = 0;
    }
    
    //增(重点)
    //尾插  平均O(1)
    public void pushBack(int element) {
        ensureCapacity();//扩容
        array[size++] = element;
    }
    
    //头插
    public void pushFront(int element) {
        ensureCapacity();//扩容
        for(int i = size;i>=1;i--)
        {
            array[i]=array[i-1];
        }
        array[0]=element;
        size++;
    }
    
    //中间任一节点插入
    public void insert(int index, int element){
        if(index<0 || index>size)
        {
            System.err.println("插入失败");
            return;
        }
        
        ensureCapacity();//扩容
        
        for(int i = size - 1;i>=index;i--)
        {
            array[i+1]=array[i];
        }
        array[index]=element;
        size++;
    }        
    
    //删(重点)
    //尾删
    public void popBack() {
        if(size<=0)
        {
            System.err.println("顺序表为空,无法删除");
            return;
        }
        array[--size]=0;
    }
    //头删
    public void popFront() {
        if(size<=0)
        {
            System.err.println("顺序表为空,无法删除");
            return;
        }
        for(int i=0;i<=size-2;i++)
        {
            array[i]=array[i+1];
        }
        array[--size]=0;
    }
    
    //中间删
    public void earse(int index) {
        if(size<=0)
        {
            System.err.println("顺序表为空,无法删除");
            return;
        }
        if(index<0 || index>=size)
        {
            System.err.println("删除失败");
            return;
        }
        for(int i=index+1;i<=size-1;i++)
        {
            array[i-1]=array[i];
        }
        array[--size]=0;
    }
    
    //返回·element在顺序表中的下标,如果出现多次,返回第一个下标
    public  int indexOf(int element) {
        for(int i = 0 ; i<size;i++)
        {
            if(array[i]==element)
            {
                return i;
            }
        }
        return -1;
    }
    
    //拿到下标,返回值
    public int get(int index) {
        if(index<0||index>=size)
        {
            System.out.println("无法找到下标");
            return -1;
        }
        return array[index];
    }
    
    //修改数值
    public void set(int index,int element) {
        if(index<0||index>=size)
        {
            System.out.println("无法找到下标");
            return ;
        }
        array[index]=element;
    }
    
    //删除掉某一个元素,如果出现多次,删除第一个出现的
    public void remove(int element) {
        int index = indexOf(element);
        if(index != -1)
        {
            earse(index);
        }
    }
    
    public int size() {
        return size;
    }
    
    public boolean isEmpty() {
        return size == 0;
    }
    
    //删除所有相同的元素
    public void removeAll(int element) {
        /*
        时间:O(n^2)     空间:O(1)
        int index;
        while((index=indexOf(element))!=-1)
        {
            earse(index);
        }
        
        时间:O(n)      空间:O(n)
        int[] newArray = new int[array.length];
        int j = 0;
        for(int i = 0;i<size;i++)
        {
            if(array[i]!=element)
            {
                newArray[j++]=array[i];
            }
        }
        array = newArray;
        size = j;
        */
        
        //时间:O(n)          空间:O(1)
        int j = 0;
        for(int i = 0;i<size;i++)
        {
            if(array[i]!=element)
            {
            array[j++]=array[i];
            }
        }
        size = j;
    }
    
    //打印
    public void print() {
        System.out.println("打印顺序表:当前容量为:"+array.length);
        for(int i = 0;i<size;i++)
        {
            System.out.println(array[i]+" ");
        }
        System.out.println();
    }
    
    //扩容
    public void ensureCapacity() {
        if(size<array.length)
        {
            return;
        }
        int newCapacity = array.length*2;
        int[] newArray = new int[newCapacity];
        for(int i = 0;i<size;i++)
        {
            newArray[i] = array[i];
        }
        array = newArray;
    }
    public static void main(String[] args){
        MyArrayList list = new MyArrayList();
        list.print();
        list.pushBack(1);
        list.pushBack(2);
        list.pushBack(3);  
        list.print();//1,2,3
        list.pushFront(10);
        list.pushFront(20);
        list.pushFront(30);
        list.print();//30,20,10,1,2,3
        list.insert(3,100);
        list.print();//30,20,10,100,1,2,3
        list.insert(20,200);//报错
        
        list.earse(2);
        list.earse(2);
        list.print();//30,20,1,2,3
        list.popFront();
        list.popFront();
        list.popFront();
        list.print();//2,3
        list.popBack();
        list.popBack();
        list.print();//空
        list.popBack();//报错
        
        list.pushBack(1);
        list.pushBack(2);
        list.pushBack(1); 
        list.print();//1  2  1
        System.out.println(list.indexOf(1));
        list.set(1,1);
        list.print();// 1 1 1
        list.remove(1);
        list.print();// 1 1
        list.pushBack(1);
        list.print();// 1 1 1
        list.removeAll(1);
        list.print();// 空
        
    }
 
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值