一、數據結構基本概念
-數據:一切可以輸入計算機並能被處理的都是數據;
-數據元素
-數據對象
學生-數據對象,姓名,性別,身高,課程代號是數據元素,身高是數據項。
二、數據結構(data structure)
》邏輯結構
-集合:元素羅列在一起
-線性結構:元素前後相繼(一一對應)
-樹形結構:元素存在一對多的關係
-圖結構或網狀結構:元素之間存在多對多的關係。
》存儲結構
-順序存儲:地址連續,用數組。
-鏈式存儲:地址不連續,用指針(引用,面向對象)。
樹和圖基本都是鏈式存儲,其他存儲結構基本都是順序存儲和鏈式存儲。
三、數據結構就是用一種特別的方式存起來,便於方便的取出來。
數據結構的主要運算(操作)
爲了某種特殊需求(取數據),而專門設計的數據存儲方式。
①建立一個數據結構;②消除一個數據結構;③刪除;④插入;⑤訪問;⑥修改;⑦排序;⑧查找;
四、列表:順序表和鏈表
>定義列表接口
>用數組實現-MyArrayList
>實現鏈表
>java List API
>相關技巧
五、用順序存儲(數組)來實現列表
5.1建一個接口
public interface MyList {
void add(Object element);//新增一個元素
void delete(Object element);//刪除相同元素
void deleteByIndex(int index);//根據索引刪除元素
void update(int index,Object newElement);//將指定索引位置的元素替換成新元素
boolean contains(Object target);//當前列表中是否含有target元素
Object at(int index);//根據指定索引返回元素
int indexOf(Object element);//查找element所在的索引,如果沒有返回-1
}
5.2寫實現類
public class MyArrayList implements MyList{
private Object[] elements;//真正存儲元素的底層結構
private int size;//元素個數
private int capacity=10;//容量
public MyArrayList(int capacity) {//指定數組容量
this.capacity = capacity;
elements=new Object[capacity];
}
public MyArrayList() {//默認數組容量
elements=new Object[capacity];
}
@Override
public void add(Object element) {
if(size==capacity) {//擴容
capacity*=2;
Object[] newArr=new Object[capacity];//因爲數組長度不可變,所以要新建一個新的數組,把舊的數組元素拷過來
for(int i=0;i<size;i++) {//O(n),耗費時間,耗費內存
newArr[i]=elements[i];
}
elements=newArr;//把舊的那個數組丟掉
}else {
elements[size++]=element;
}
}
@Override
public void delete(Object element) {
int index=indexOf(element);
if(index>=0) {
deleteByIndex(index);
}
}
@Override
public void deleteByIndex(int index) {//緊密
Object[] newArr=new Object[capacity-1];//因爲數組長度不可變,所以要新建一個新的數組,把舊的數組元素拷過來
for(int i=0;i<size;i++) {//O(n),耗費時間,耗費內存
if(i==index) continue;
newArr[i]=elements[i];
}
elements=newArr;//把舊的那個數組丟掉
}
@Override
public void update(int index, Object newElement) {
elements[index]=newElement;
}
@Override
public boolean contains(Object target) {
return indexOf(target)>0;
}
@Override
public Object at(int index) {
return elements[index];
}
@Override
public int indexOf(Object element) {
for(int i=0;i<size;i++) {
if(elements[i].equals(element)) {
return i;
}
}
return -1;
}
//重寫toString
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");
for(int i=0;i<size;i++) {
sb.append(elements[i]+(i==size-1?"":","));
}
sb.append("]");
return sb.toString();
//return "MyArrayList [elements=" + Arrays.toString(elements) + "]";//輸出結果爲:MyArrayList [elements=[周婷婷, 樂觀, 勤奮, null, null, null, null, null, null, null]]
}
}
5.3測試類
public class MyArrayListTest{
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
list.add("周婷婷");
list.add("勤奮");
list.add("樂觀");
list.add("修改內容");
list.add("刪除內容");
list.add("刪除下標");
list.delete("刪除內容");
list.deleteByIndex(5);
list.update(3, "內容被修改了");
boolean contain= list.contains("樂觀");
int indexOf=list.indexOf("勤奮");
System.out.println(list);
System.out.println(contain);
System.out.println(indexOf);
}
}
5.4運行結果