```// 順序表的元素類型 int
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 - 1; 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; i++) { array[i - 1] = array[i]; } array[--size] = 0; } // 查 // 改 // 打印 public void print() { System.out.println("打印順序表: 當前容量: " + array.length); for (int i = 0; i < size; i++) { System.out.print(array[i] + " "); } System.out.println(); } // 保證容量夠用,不然進行擴容 private 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; } // 返回 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.err.println("下標錯誤"); return -1; } return array[index]; } public void set(int index, int element) { if (index < 0 || index >= size) { System.err.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;//j是不一樣於element的個數,傳給size,這是整個數組裏前size都是不一樣的 } 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(); // 報錯 }
}ide