Java數據結構之手寫LinkedList

LinkedList的實現本質爲一個雙向鏈表,下面是簡單的實現增刪改查:

public class LinkedList<E> {

    Node<E> first;
    Node<E> last;

    public int size;
    public LinkedList(){

    }

    public void add(E e){
        linkLast(e);
    }
    public void change(int index,E e){

        if (size<0||size<index){
            return;
        }
        Node<E> target=node(index);
        target.item=e;
    }

    /**
     * 刪除指定的節點
     * @param index
     */
    public void remove(int index){
        if (size<0|size<index){
            return;
        }
        //找到節點
        Node<E> target=node(index);
        unLinkList(target);
    }

    public void unLinkList(Node<E> target){
        //目標節點的前後節點
        Node<E> pre=target.prev;
        Node<E> next=target.next;
        //把前後節點連接起來
        if (pre==null){
            first=target.next;
        }else{
            pre.next=target.next;
        }

        if (next==null){
            last=target.prev;
        }else{
            next.prev=target.prev;
        }
        size--;
    }
    /**
     *添加節點到指定的位置
     * @param index 位置索引
     * @param e
     */
    public void add(int index,E e){
        //超過總長
        if (size<0||index>size){
            return;
        }else{
            //在尾部
            if (size==index){
                linkLast(e);
            }else{
                //找到目標節點
                Node<E> target=node(index);
                //斷開目標節點
                Node<E> pre=target.prev;
                Node<E> node= new Node<E>(pre,e,target);
                //前後連接
                if (pre==null){
                    first=node;
                }else{
                    pre.next=node;
                }
                target.prev=node;
                size++;
            }
        }
    }


    /**
     * 根據索引獲取值
     * @param index i
     * @return
     */
    public E get(int index){

        if (size<0||size<index){
            return null;
        }
        return node(index).item;
    }

    private Node<E> node(int index){

        if (index<(size>>1)){
            Node<E> node=first;
            for (int i = 0; i <index ; i++) {
                node=node.next;
            }
            return node;
        }else{
            Node<E> node=last;
            for (int i = size-1; i >index ; i--) {
                node=node.prev;
            }
            return node;
        }
    }

    /**
     * 向鏈表添加一個節點 到尾部
     * @param e
     */
    private void linkLast(E e){
        Node<E> newNode=new Node<E>(last,e ,null);

        Node<E> l=last;
        last = newNode;
        //沒有節點
        if (l==null){
           first=newNode;
        }else{
            l.next=newNode;
        }
        size++;
    }

    private static class Node<E>{
        E item;
        Node<E> next;
        Node<E> prev;
        Node(Node<E> prev,E element,Node<E> next){
            this.item=element;
            this.prev=prev;
            this.next=next;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章