自主程式碼封裝LinkedList集合物件
阿新 • • 發佈:2018-12-13
LinkedList集合內部是連結串列資料結構儲存元素機制,前一個儲存節點物件記住下一個儲存節點物件的地址這樣環環相扣形成一個鏈條,就像自行車的鏈條一樣.每儲存一個元素在連結串列最後節點處記住新元素物件的地址,當需要刪除一個元素只需在被刪除元素的前一個元素切斷與被刪除元素的地址引用替換成指向被刪除元素後一個元素的地址,被刪除元素因為沒有被任何物件地址引用 則會被垃圾回收清理從而達到刪除元素的效果. 瞭解連結串列結構的原理後我們用程式碼實現這個案例吧!具體程式碼要點細節部分已經註釋好了 整理好思路仔細閱讀即可.
首先我們建立一個節點類 屬性value用於儲存資料 next表示下一個節點物件
package LinkedList; public class Node { //定義節點物件 用用於儲存 元素value 關聯一下一個節點 private Object value; private Node next; public Node(Object value) { //構造方法傳一個元素物件並存儲儲存 this.value = value; } public Object getValue() { //返回當前節點物件 return value; } public void setValue(Object value) { //設定當前節點物件 this.value = value; } public Node getNext() { //返回下一個節點物件 return next; } public void setNext(Node next) { //設定下一個節點物件 this.next = next; } }
有了節點物件作為連結串列結構的鋪墊 我們現在再建立LinkedList的描述類吧
package LinkedList; public class MyLinkedList { private Node first; //定義一個頭部節點 代表連結串列集合第一個元素 private int size = 0; //定義連結串列集合容量大小 public int getSize(){ //返回集合大小方法 return size; } public void addValue(Object value){ //新增元素方法 Node newNode = new Node(value); //new一個節點物件儲存元素 if(size == 0){ //先判斷是否為第一個元素 first= newNode; //將頭部節點物件指向剛存下一個元素的新節點 }else{ Node temp = first; //不是第一個節點 則需要一個臨時節點充當指標 從頭往後遍歷 while(temp.getNext()!=null){ //臨時節點下一個節點物件不為空時 temp=temp.getNext(); //指標臨時節點向後移動一位 指向一下節點物件 } //迴圈保證指標節點最後指向最後一個元素 temp.setNext(newNode); //臨時節點關聯的下一個節點物件指向 將新節點 } size++; //儲存成功size+1 } public Object getValue(int index){ //取出指定索引下的元素 Node temp = first; //指標指向頭部元素 for(int i = 0;i<index;i++){ temp =temp.getNext(); //指標指向index元素的前一個元素時迴圈結束 } //並取出index前一位元素的一下一個元素 也就是當前index下的元素 return temp.getValue(); //直接返回index下的元素 } public void setValue(int index,Object value){ //設定索引下的元素 原理同getValue方法 Node temp = first; for(int i = 0;i<index;i++){ temp =temp.getNext(); } temp.setValue(value); } public void clear(){ //清空集合方法 size = 0; first =null; //連結串列資料結構最關鍵的是頭部元素 當頭部元素為空時後面的元素也無法找到 } //涉及到jvm虛擬機器垃圾回收機制 細節請參考深入理解jvm虛擬機器一書 public void removeAt(int index){ //刪除指定索引下的元素 if(index == 0){ //假如刪除頭部元素:將頭部物件指向原來頭部節點物件的下一個節點物件 first = first.getNext(); //原來的頭部節點物件因為沒有被地址引用會被jvm垃圾回收 達到刪除效果 }else{ Node temp = first; //指標從頭部往後遍歷 for(int i = 0;i<index-1;i++){ //遍歷到index元素的前兩位元素下 temp = temp.getNext(); } //指標從index的前一個元素關聯到index後一位元素 孤立index下元素導致沒有被地址指向被垃圾回收 temp.setNext(temp.getNext().getNext()); } size--; //元素刪除成功 size-1 } }
public class LinkedDemo { public static void main(String[] args) { MyLinkedList list = new MyLinkedList(); list.addValue(0); list.addValue(1); list.addValue(2); list.addValue(3); list.addValue(4); list.addValue(5); for(int i = 0;i<list.getSize();i++){ System.out.println(list.getValue(i)); } } }
這樣節點物件和list物件相輔相成,一個自主封裝的連結串列集合就完成了;其中涉及到資料結構和一點邏輯演算法的知識,對於初學java基礎和對演算法基礎比較薄弱的朋友這個案例可能有點不能接受,但是不要怕隨著時間推移每天學習的積累 這兩段程式碼花時間多琢磨一下必定能參透其中的真諦! 碼字不易程式碼加註釋更不易,覺得有收穫就小小點個贊吧! ~~~~~~~~~~~~ :)