自定義實現鏈表很簡單,只需要明白鏈表是什么樣子的數據結構。
下圖表示一種單向列表。其中指針first指向隊頭,last指向隊尾,curr指向當前讀的數據。
下面是我的實現代碼,很簡單,明白上述結構后,關鍵是構造一個內部類,里面包含一個指向下一個元素的對象(指向下一個元素的指針)
public class MyLinkedList<T>{ /** * 指向list中最后一個元素 */ Node<T> last; /** * 指向list中第一個元素 */ Node<T> first; /** * 指向當前讀取的元素 */ Node<T> currRead; private int size ; /** * <默認構造函數> */ public MyLinkedList(){ size = 0; last = new Node(null,-1); first = last; currRead = first; } /** * 往鏈表中添加數據(隊尾添加數據) * <功能詳細描述> * @param element * @return * @see [類、類#方法、類#成員] */ public T add(T element){ Node<T> newNode = new Node<T>(null,element); last.next = newNode; last = newNode; if(size == 0){ first = newNode; } size ++; return element; } /** * 移除鏈表中的數據(隊頭移除) * <功能詳細描述> * @return * @see [類、類#方法、類#成員] */ public T remove(){ if(size == 0){ System.out.println("empty list "); currRead = first; return null; } T result = first.element; first = first.next; currRead = first; size--; return result; } /** * 獲取隊列中的元素 * <功能詳細描述> * @return * @see [類、類#方法、類#成員] */ public T get(){ if(currRead.next == null){ setReadAgain(); return currRead.element; } T result = currRead.element; currRead = currRead.next; return result; } /** * 再次從頭開始讀取數據 * <功能詳細描述> * @see [類、類#方法、類#成員] */ public void setReadAgain() { currRead = first; } public String toString(){ StringBuilder sb = new StringBuilder(); for(int i=0;i<size;i++){ T ele = get(); sb.append(currRead.element + "-->"); } return sb.toString(); } /** * 獲取隊列大小 * <功能詳細描述> * @return * @see [類、類#方法、類#成員] */ public int getSize(){ return this.size; } class Node<T> { Node<T> next; T element; public Node( Node<T> next, T element){ this.next = next; this.element = element; } }
實踐一下,看能不能使用
public class Test { public static void main(String[] args){ MyLinkedList linkedList = new MyLinkedList(); System.out.println("-------start-------"); System.out.println(linkedList.toString()); for (int i=0;i<5;i++){ linkedList.add(i+1); } System.out.println(linkedList.toString()); for(int i=0;i<5;i++){ System.out.println(linkedList.remove()); } System.out.println(linkedList.toString()); System.out.println("-------end-------"); }
下面是結果