顺序表--增删查改(java)

头插
 1. 需要从后往前遍历
 2. 数据下标遍历范围 (红色标记 )[size-1,0]
    空间下标遍历范围(蓝色标记) [size,1]
 3. 搬移过程   array[空间下标]=array[数据]
 4. 空间下标=数据下标+1

在这里插入图片描述
扩容
 1. 扩容的条件
   在插入之前,size = array.length
 2.如何扩容(搬家)
   1. 申请新房子(1.5 - 2倍)   1.5倍
   2. 把东西都搬进去
   3. 朋友圈通知自己新家
   4. 旧的房子退掉
 3. 那些方法需要考虑扩容
   所有插入

//1.申请新房子
  int newCapacity=array.length+array.length/2;
  int[] newArray=new int[newCapacity];
  //2.搬家
  for(int i=0;i<array.length;i++){
   newArray[i]=array[i];
  }
  //3.发朋友圈
  this.array=newArray;
  
  //退老房子,利用java的垃圾回收,自动回收原来的数组

总练习的代码:

import java.util.Arrays;
public class SeqList{
 private int[] array;
 private int size;
 public SeqList(){
  array=new int[11];
  size=0;
 }
 //头插O(n)
 public void pushFront(int element){
  ensureCapacity();
  for(int i=size-1;i>=0;i--){
   array[i+1]=array[i];
  }
  array[0]=element;
  size++;
 }
 //尾插O(1)
 public void pushBack(int element){
  ensureCapacity();
  array[size++]=element;
 }
 public void insert(int index,int element){
  if(index<0||index>size){
   System.out.println("index非法");
   return ;
  }
  ensureCapacity();
  for(int i=size-1;i>=index;i--){
   array[i+1]=array[i];
  }
  array[index]=element;
  size++;
 }
 //
 public void popFront(){
  if(size==0){
   System.out.println("空顺序表,无法删除");
   return ;
  }
  for(int i=0;i<size-1;i++){
   array[i]=array[i+1];
  }
  array[--size]=0;
 }
 public void popBack(){
  if(size==0){
   System.out.println("空顺序表,无法删除");
   return ;
  }
  array[--size]=0;
 }
 public void erase(int index){
  if(index<0||index>=size){
   System.out.println("index非法");
   return ;
  }
  for(int i=index;i<size-1;i++){
   array[i]=array[i+1];
  }
  array[--size]=0;
 }
 //查找
 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("下标错误");
  }
  array[index]=element;
 }
 public int size(){
  return size;
 }
 public boolean isEmpty(){
  return size==0;
 }
 public int capacity(){
  return array.length;
 }
 //便于打印 显示顺序表已有元素
 public String toString(){
  return Arrays.toString(Arrays.copyOf(array,size));
 }
 //O(n) 
 //删除第一个与元素相等的那个下标的元素
 public void remove(int element){
  int index=indexOf(element);
  if(index!=-1){
   erase(index);
  }
 }
 //删除所有与元素相等的
 public void removeAll(int element){
  int j=0;
  for(int i=0;i<size;i++){
   if(array[i]!=element){
    array[j++]=array[i];
   }
  }
  size=j;
 }
 //内部使用方法
 //无论是否需要扩容,调用这个方法保证容量够用
 private void ensureCapacity(){
  if(size<array.length){
   //不需扩容
   return ;
  }
  
  //1.申请新房子
  int newCapacity=array.length+array.length/2;
  int[] newArray=new int[newCapacity];
  //2.搬家
  for(int i=0;i<array.length;i++){
   newArray[i]=array[i];
  }
  //3.发朋友圈
  this.array=newArray;
  
  //退老房子,利用java的垃圾回收,自动回收原来的数组
 }
 public static void test1(String[] args){
  SeqList seqList=new SeqList();
  System.out.println(seqList.toString());
  
  //尾插 1  2  3
  seqList.pushBack(1);
  seqList.pushBack(2);
  seqList.pushBack(3);
  //[1,2,3]
  System.out.println(seqList.toString());
  
  //头插 10 20 30
  seqList.pushFront(10);
  seqList.pushFront(20);
  seqList.pushFront(30);
  //[30,20,10,1,2,3]
  System.out.println(seqList.toString());
  
  seqList.insert(2,100);
  seqList.insert(4,200);
  //[30,20,100,10,200,1,2,3]
  System.out.println(seqList.toString());
  
  
  System.out.printf("当前容量:%d%n",seqList.capacity());
  
  seqList.pushBack(1000);
  seqList.pushBack(2000);
  seqList.pushBack(3000);
  seqList.pushBack(4000);
  seqList.pushBack(5000);
  seqList.pushBack(6000);
  //[30,20,100,10,200,1,2,3,1000,2000,3000,4000,5000,6000]
  System.out.printf("当前容量:%d%n",seqList.capacity());
  
  seqList.popFront();
  seqList.popFront();
  seqList.popFront();
  seqList.popFront();
  //[200,1,2,3,1000,2000,3000,4000,5000,6000]
  System.out.println(seqList.toString());
  
  seqList.popBack();
  seqList.popBack();
  seqList.popBack();
  //[200,1,2,3,1000,2000,3000]
  System.out.println(seqList.toString());
 }
 public static void test2(String[] args){
  SeqList s=new SeqList();
  s.pushBack(1);
  s.pushBack(2);
  s.pushBack(3);
  s.pushBack(4);
  s.pushBack(1);
  s.pushBack(2);
  s.pushBack(3);
  s.pushBack(4);
  System.out.println(s.toString());
  
  s.remove(2);
  //[1,3,4,1,2,3,4]
  System.out.println(s.toString());
  
  s.removeAll(3);
  //[1,4,1,2,4]
  System.out.println(s.toString());
 }
 public static void main(String[] args){
  test1(args);
  test2(args);
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值