鏈表是一種物理存儲單元上非連續、非順序的存儲結構。node
鏈表是由那幾個部分組成的呢?
是由N個節點組成的
每個節點分爲兩部分:
1.數據域
2.指針域this
數據域用來存儲數據,指針域用來連接各個鏈表。spa
public class Node<E> { private E e;// 數據域 private Node<E> next;// 引用域 public Node() { } public Node(E e) { this.e = e; } public E getE() { return e; } public void setE(E e) { this.e = e; } public Node<E> getNext() { return next; } public void setNext(Node<E> next) { this.next = next; }
public class MyLinkedList<E> { //聲明頭節點 private Node<E> root; private int size;//聲明單鏈表中存儲的節點數 public MyLinkedList(){ root = new Node<E>();//實例化頭節點 } /** * 向鏈表中添加元素的方法 * @param e要添加的元素 */ public void add(E e){ //根據e實例化了一個新的節點對象 Node<E> node = new Node<E>(e); //獲取root的下一個節點 Node<E> tnode = root.getNext(); root.setNext(node);//將新的節點做爲root的下一個節點 node.setNext(tnode);//將root原來的下一個節點做爲新增長節點的下一個節點 size++;//記錄添加的節點數 } /** * 刪除指定索引位置的元素 * @param index索引位置 * @return 返回刪除的元素 */ public E remove(int index){ if(index <= 0 || index > size) return null; //獲取要刪除節點的前一個節點 Node<E> node = select(index-1); //獲取要刪除的節點 Node<E> dNode = node.getNext(); //獲取要刪除節點的後一個節點 Node<E> nNode = dNode.getNext(); //先創建刪除節點的前一個節點和刪除節點的後一個節點的關係 node.setNext(nNode); //清除dNode的下一個節點 dNode.setNext(null); size--;//計數器減一 return dNode.getE();//返回刪除節點中的數據域 } /** * 獲取指定索引位置的元素 * @param index索引位置 * @return 返回節點中的數據域 */ public E get(int index){ if(index <= 0 || index > size) return null; //查找指定索引位置的節點對象 Node<E> node = select(index); //獲取節點中的數據域元素並返回 return node.getE(); } /** * 獲取單鏈表中存儲的元素總數 * @return 返回size屬性 */ public int size(){ return size; } /** * 獲取指定索引位置的節點對象 * @param index索引位置 * @return 返回獲取到的節點對象 */ private Node<E> select(int index){ Node<E> node = root.getNext();//將頭節點的下一個節點賦給node if(index==1)//若是index是1表示是頭結點的下一個節點 return node;//直接返回node for(int i=1;i<index;i++){ node = node.getNext();//獲取node的下一個節點 } return node; } }
上面所述的是咱們的單向鏈表,可是同時也具備雙向的鏈表。指針
public class Node<E> { private E e;// 數據域 private Node<E> next;// 引用域 private Node<E> last;//引用域 public Node() { } public Node(E e) { this.e = e; } public E getE() { return e; } public void setE(E e) { this.e = e; } public Node<E> getNext() { return next; } public void setNext(Node<E> next) { this.next = next; } public Node<E> getLast(){ return last; } public void setLast(Node<E> last){ this.last = last; } }
這上面就是雙向鏈表的鏈表結構,咱們也就是僅僅的添加了兩個功能和一個變量而已,這個變量就是節點的上一個節點。而新的功能就是查找節點的上一節點的能力。code