LinkedList 鏈表結構 手寫源碼 實現部分功能

今天疫情有所好轉 十五的月亮 十六圓 晚上記得看月亮啊

自己的粗略見解 有問題可以隨時指出 多多進步

LinkedList 底層爲鏈表結構
首先先要明白何爲鏈表結構 如圖下

在這裏插入圖片描述

基本是上圖這個意思 每個節點代碼可以:

public class Node { //

     private Node previous; //上一個節點
     private  Node next;  //下一個節點
     private Object element; //元素數據

    public Node(Object element) { //有參構造
        this.element = element;
    }

    public Node getPrevious() {
        return previous;
    }

    public void setPrevious(Node previous) {
        this.previous = previous;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Object getElement() {
        return element;
    }

    public void setElement(Object element) {
        this.element = element;
    }
}

這是手寫的部分源碼 可以參考下自己寫寫

比較簡答的功能

public class MyLinkedList<E> {
     private Node first; //第一個元素
     private Node end; //最後一個元素
     private int  size;  //長度

     //新增方法
     public void add(E element){
         Node node = new Node(element);
         if(first == null){
             //node.setPrevious(null); //上一個元素爲null
              //node.setNext(null);  //下一個元素也爲null

             first =node;
             end =node;
         }else{
             node.setPrevious(end); //節店的上一個元素賦值
             node.setNext(null);  //節店的下一個元素賦值
             end.setNext(node); //這時候的end  是倒數第二個值
             end = node; //將最後一個節點賦值給end

         }
         size++;
     }

     //在指定位置新增元素
     public void add(int index,E element){
         checkRange(index);
         Node node = getNode(index);
         Node newNode =  new Node(element);
         if(node != null){
             Node up = node.getPrevious();
             if(up !=null){
                 up.setNext(newNode);
             }
             node.setPrevious(newNode);
             newNode.setNext(node);
             if(index ==0){ //如果改變第一個值
                 first.setPrevious(newNode);
                 newNode.setNext(first);
                 first =newNode;
             }

             if(index == size-1){//如果改變的是最後一個的值
                 end = newNode;
             }
             size++;
         }
     }
     //get 方法
     public Object get(int index){
         Node temp = getNode(index);
         return  temp==null?null : temp.getElement();
     }

     //檢查下標越界
     private void checkRange(int index){
         if(index<0 || index>size-1){
             throw new RuntimeException("下標越界"+index);
         }
     }

     //根據id 獲取節點
     private Node getNode(int index){
         Node temp = null;
         checkRange(index);
         if(index<size>>1){//加快查詢效率
             temp =first;
             for (int i = 0; i <index; i++) {
                 temp = temp.getNext();
             }

         }else{
             temp =end;
             for (int i = size-1; i>index; i--) {
                 temp = temp.getPrevious();
             }

         }
         return  temp;
     }

     //移除方法
     public void remove(int index){
         checkRange(index);
         Node node = getNode(index);
         if(node != null) {

             Node up = node.getPrevious(); //上一個元素
             Node down = node.getNext(); //下一個元素

             if (up != null) {
                 up.setNext(down);
             }
             if (down != null) {
                 down.setPrevious(up);
             }

             if (index == 0) { //如果是第一個元素
                 first = down;
             }
             if (index == size - 1) { //如果是最後一個元素
                 end = up;
             }

         }
     }



     //重寫toString 方法
    @Override
    public String toString() {
       Node temp = first;
       StringBuilder strb = new StringBuilder("[");
       while (temp!=null){
           strb.append(temp.getElement()+",");
     //      System.out.println(temp.getElement());
           temp =temp.getNext(); //把下一個節點賦值給temp
       }
       strb.setCharAt(strb.length()-1,']');
       return strb.toString();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章