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{
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{
if(array[i]!=element)
{
newArray[j++]=array[i];
}
}
array = newArray;
size = j;
*/
//时间:O(n) 空间:O(1)
int j = 0;
for(int i = 0;i{
if(array[i]!=element)
{
array[j++]=array[i];
}
}
size = j;
}
//打印
public void print() {
System.out.println("打印顺序表:当前容量为:"+array.length);
for(int i = 0;i{
System.out.println(array[i]+" ");
}
System.out.println();
}
//扩容
public void ensureCapacity() {
if(size{
return;
}
int newCapacity = array.length*2;
int[] newArray = new int[newCapacity];
for(int i = 0;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();// 空
}
}