头插
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);
}
}