java之鏈表

鏈表是一種物理存儲單元上非連續、非順序的存儲結構。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

相關文章
相關標籤/搜索