剛開始學習java不久的時候覺得java沒有指針。。。不知道怎麼弄鏈表,最近才頓悟完成這個簡單的鏈表。。。實現這個鏈表類讓我感受面向對象思想更進一步,建議本身看了思路本身作。(我就是o(^▽^)o)java
java中有基本數據類型和引用數據類型(其實就是指針)。若是對引用不夠了解請訪問 http://zwmf.iteye.com/blog/1738574 (我以爲寫得特別好,就不必重複了)。ide
實現鏈表的思路:函數
1)鏈表類,結點類(鏈表類的內部類),在main()方法建立一條鏈表類對象,經過方法逐步建立結點類,經過引用連接起來成爲鏈表。學習
2)結點類包含數據和對下個結點的引用,以及能夠對數據賦值的構造函數。this
3)鏈表類的構造方法,只構造出不含數據的頭結點。(外部類能夠直接對內部類的私有成員進行訪問,這樣就能夠直接修改引用)spa
主體代碼:指針
1 public class MyLink<E>{ 2 private class Node{ 3 privare Object data; //保存數據 4 private Node next; //對下個結點的引用 5 } 6 }
完整版代碼(鏈表下標從0開始):code
1 package myLink; 2 3 public class MyLink<E> { //使用泛型是爲了使用時候能夠規範鏈表的數據類型 4 // 結點內部類 5 private class Node { 6 private Object data; //數據 7 private Node next = null; //指向下個結點的引用 8 9 public Node() { //無參數構造函數爲了建立頭結點服務 10 data = null; 11 } 12 13 public Node(E data) { //帶數據的構造函數 14 this.data = data; 15 } 16 17 } 18 19 private Node head; // 頭引用(指針) 20 private Node rear; // 尾引用(指針) 21 private Node point; //臨時引用(指針) 22 private int length; // 鏈表長度 23 24 public MyLink() { //鏈表構造函數,建立無數據的頭結點 25 head = new Node(); 26 rear = head; 27 length = 0; 28 } 29 30 /** 31 * 從尾部插入鏈表 32 * 33 */ 34 public void add(E elem) { 35 point = new Node(elem); 36 rear.next = point; 37 rear = point; 38 length++; 39 40 } 41 42 /** 43 * 遍歷輸出鏈表 44 */ 45 public void traverse() { 46 point = head; //移動臨時引用到頭結點 47 if (head != null) 48 System.out.print("[" + head.data + "]"); 49 while (point.next != null) { 50 System.out.print("-➜[" + point.next.data + "]"); 51 point = point.next; 52 } 53 System.out.println(); 54 } 55 56 /** 57 * 得到鏈表長度 58 * 59 */ 60 public int length() { 61 return length; 62 } 63 64 /** 65 * 清除鏈表內容 66 * (java垃圾回收,當對象沒有引用指向,則視爲垃圾,清理時機由系統決定) 67 */ 68 public void clear() { 69 while (head.next != null) { 70 head.next = head.next.next; 71 } 72 rear = head; // 回到初始狀態 73 point = null; 74 length = 0; 75 System.gc(); //請求系統清理垃圾,未必有用 76 } 77 78 /** 79 * 在指定個位置插入元素成爲第p個元素 80 */ 81 public void insert(int position, E elem) { 82 if(position>=0 && position<=length){ 83 point = movePoint(position); 84 Node tmp = new Node(elem); 85 tmp.next = point.next; 86 point.next = tmp; 87 length++; 88 }else{ 89 System.out.println("沒有指定位置,插入失敗") 90 } 91 92 } 93 94 /** 95 * 刪除指定位置的元素 96 */ 97 public void remove(int position) { 98 if (position >= 0 && position < length) { 99 point = movePoint(position); 100 Node tmp = point.next; 101 point.next = tmp.next; 102 length--; 103 } else { 104 System.out.println("刪除失敗,沒有指定位置元素"); 105 } 106 } 107 108 /** 109 * 更改指定位置的元素 110 */ 111 public void set(int position, E elem) { 112 if (position >= 0 && position < length) { 113 point = movePoint(position); 114 point.next.data = elem; 115 } else { 116 System.out.println("修改失敗,沒有指定位置元素"); 117 } 118 } 119 120 /** 121 * 移動指針到指定位置 122 * 私有方法,供其它方法使用 123 */ 124 private Node movePoint(int position) { 125 if (position < 0) //若是參數小於零,則移動到頭部,原本是爲了規避參數錯誤問題,但在使用此方法的其餘方法皆有作其餘處理,可刪除 126 return head; 127 if (position > length) //若是參數大於長度,則移動到尾部,同上,可刪除 128 return rear; 129 130 if (position >= 0 && position <= length) { 131 point = head; 132 while (point != null) { 133 if (position == 0) 134 break; 135 position--; 136 point = point.next; 137 } 138 } 139 140 return point; 141 142 } 143 144 /** 145 * 鏈接兩條鏈表 146 * 已知問題,兩鏈表的數據類型不必定相同,憑我目前實力沒法理解解決(如何獲取泛型實際類型) 147 */ 148 public void connect(MyLink b) { 149 this.rear.next = b.head.next; 150 this.length += b.length; 151 b.head = null; 152 } 153 154 /** 155 * 按下標查找 156 */ 157 public E find(int position) { 158 if (position >= 0 && position < length) { 159 Node tmp = movePoint(position); 160 return (E) tmp.next.data; 161 } 162 return null; 163 } 164 165 /** 166 * 查找元素的值,返回下標 167 */ 168 public int search(E elem) { 169 point = head.next; 170 int idex = -1; 171 while (point != null) { 172 idex++; 173 if (point.data == elem) 174 break; 175 point = point.next; 176 } 177 return idex; 178 179 } 180 }
撰寫時間:2017-07-27 21:03:19對象
修改時間:blog
感受有些地方處理的很差,很粗糙,未來慢慢改進吧。
若代碼有什麼不足,不吝賜教。