日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

自定义实现LinkList

發布時間:2024/8/26 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 自定义实现LinkList 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

linkList底層是雙向鏈表,其增加,刪除速度快,但是查找慢。

增加新節點時,因為插入是有序的,所以應該進行尾插。

 //添加元素
    public boolean add(T e) {
        Node newNode = new Node(e,null,null);
        if(size == 0){
            tail = head = newNode;
        }else {
            //新節點的直接前驅
            newNode.pre = tail;
            //新節點的直接后繼
            newNode.next = null;
            //更新tail結點
            tail.next = newNode;
            tail = newNode;
        }
        size++;
        return true;
    }

  獲取元素:

    public T get(int index){
        Node tmp = head;
        if(index<0 || index>=size){
            throw new RuntimeException("參數不合法"+index);
        }else {
            for (int i = 0; i < index ; i++) {
                tmp = tmp.next;
            }
        }
        return (T)tmp.data;
    }

鏈表的查找效率低,為了提高查找的效率,分兩部分進行查找元素,當將元素的鏈表分為兩部分,當查找的元素靠近頭,從頭開始查找,反之從尾部開始查找。

改進如下:

    /**
     * 獲取元素,提高查找效率
     * @param index
     * @return
     */
    public T get(int index){
        if(index<0 || index>=size){
            throw new RuntimeException("參數不合法"+index);
        }
        Node tmp = null;
        if(index <= (size>>1)){  //size>>1 相當于除以2
            tmp = head;
            for (int i = 0; i < index ; i++) {
                tmp = tmp.next;
            }
        }else {
                tmp = tail;
                for (int i = size-1; i > index ; i--) {
                    tmp = tmp.pre;
                }
            }
        return (T)tmp.data;
    }

  刪除元素:

(刪除元素1)

    public T remove(int index){
        Node tmp = head;
        if(index<0 || index>=size){
            throw new RuntimeException("參數不合法"+index);
        }else {
            for (int i = 0; i < index ; i++) {
                tmp = tmp.next;
            }
        }
        //第一個節點
        if (tmp == head){
            Node temp = head.next;
            head = temp;
        //最后一個節點
        }else if(tmp == tail) {
            Node temp = tmp.pre;
            tail = temp;
            //中間節點
        } else {
            //該節點的前一個結點
            Node up = tmp.pre;
            //該節點的后一個節點
            Node down = tmp.next;
            //串接
            up.next = down;
            down.pre = up;
        }
        size--;
        return (T)tmp.data;
    }

  代碼如下:

 public class MyLinkList<T> {
    private  Node  head; //頭節點
    private  Node  tail; //尾節點
    private int size;   //節點個數

    public MyLinkList(){
    this.head = new Node((T)new Object(),null,null);
    }
    //結點Node類
    class Node{
        private Object data;//存儲的元素
        private Node  pre; //前驅節點
        private Node  next; //后繼節點

        public Node(T value, Node pre, Node next) {
            data = value;
            this.pre = pre;
            this.next = next;
        }
    }

    //添加元素
    public boolean add(T e) {
        Node newNode = new Node(e,null,null);
        if(size == 0){
            tail = head = newNode;
        }else {
            //新節點的直接前驅
            newNode.pre = tail;
            //新節點的直接后繼
            newNode.next = null;
            //更新tail結點
            tail.next = newNode;
            tail = newNode;
        }
        size++;
        return true;
    }

//    //獲取元素
//    public T get(int index){
//        Node tmp = head;
//        if(index<0 || index>=size){
//            throw new RuntimeException("參數不合法"+index);
//        }else {
//            for (int i = 0; i < index ; i++) {
//                tmp = tmp.next;
//            }
//        }
//        return (T)tmp.data;
//    }

    /**
     * 獲取元素,提高查找效率
     * @param index
     * @return
     */
    public T get(int index){
        if(index<0 || index>=size){
            throw new RuntimeException("參數不合法"+index);
        }
        Node tmp = null;
        if(index <= (size>>1)){  //size>>1 相當于除以2
            tmp = head;
            for (int i = 0; i < index ; i++) {
                tmp = tmp.next;
            }
        }else {
                tmp = tail;
                for (int i = size-1; i > index ; i--) {
                    tmp = tmp.pre;
                }
            }
        return (T)tmp.data;
    }

    //元素的個數
    public int size() {
        return size;
    }

    // 刪除元素
    public T remove(int index){
        Node tmp = head;
        if(index<0 || index>=size){
            throw new RuntimeException("參數不合法"+index);
        }else {
            for (int i = 0; i < index ; i++) {
                tmp = tmp.next;
            }
        }
        //第一個節點
        if (tmp == head){
            Node temp = head.next;
            head = temp;
        //最后一個節點
        }else if(tmp == tail) {
            Node temp = tmp.pre;
            tail = temp;
            //中間節點
        } else {
            //該節點的前一個結點
            Node up = tmp.pre;
            //該節點的后一個節點
            Node down = tmp.next;
            //串接
            up.next = down;
            down.pre = up;
        }
        size--;
        return (T)tmp.data;
    }

    public static void main(String[] args) {
        MyLinkList<Integer> myLinkList = new MyLinkList();
        myLinkList.add(7);
        myLinkList.add(1);
        myLinkList.add(2);
        myLinkList.add(3);
        myLinkList.add(6);
        myLinkList.add(4);
        myLinkList.add(10);
        System.out.println("原長度:"+myLinkList.size());
        System.out.println("原鏈表:");
        for (int i = 0; i < myLinkList.size(); i++) {
            System.out.print(myLinkList.get(i)+" ");
        }
        System.out.println();
        System.out.println("刪除的元素:"+myLinkList.remove(6));
        System.out.println("刪除的元素:"+myLinkList.remove(0));
        System.out.println("后長度:"+myLinkList.size());
        System.out.println("刪除后鏈表:");
        for (int i = 0; i < myLinkList.size(); i++) {
            System.out.print(myLinkList.get(i)+" ");
        }
        System.out.println();


    }

}

  

 運行如下:

總結

以上是生活随笔為你收集整理的自定义实现LinkList的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。