手写LinKedList双向链表 终于搞清了什么是链表结构
生活随笔
收集整理的這篇文章主要介紹了
手写LinKedList双向链表 终于搞清了什么是链表结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前對Collection這塊底層實現和異同點一直模糊不清,最近手動寫了個鏈表結構實現LinKedList ,發現很多知識還是要不斷去實踐,專研,才能不斷提升。
LinKedList 實現 List接口。
鏈表結構圖
? ?a1,a2..都代表每個Node節點。
1:新建一個自定義的節點
2:新建一個自定義的LinKedList,里面只有三個基本對象,這里一定要有一個思想的轉變,這里存對象不像數組,這里是從first這個對象開始往下存,first節點對象的next又存入一個節點對象,以此類推。
MyLinKedList<E>?
3:最基本的方式進行實現。
//實例化我們的myLinKedList MyLinKedList<String> myLinKedList = new MyLinKedList<>();//假如我們要把這三個對象放入myLinKedListString s1="a";String s2="b";String s3="c";//第一次 把s1放入Node<String> node =new Node<String>(null,s1,null);//第一次存入作為第一個節點,該節點沒有上一個 所以第一個參數 nullmyLinKedList.first=node;//第一次存入作為第一個節點myLinKedList.last=node;//第一次存入也作為最后一個節點myLinKedList.size=1;//容量變為1Node<String> node2 =new Node<String>(node,s2,null);//第二次存入 ,第一個的node節點就作為第二次的上一個節點。node.next=node2;//第一個節點的下一個節點myLinKedList.last=node2;//最后一個節點myLinKedList.size=2;Node<String> node3 =new Node<String>(node2,s3,null);//一次類推。node2.next=node3;myLinKedList.last=node3;myLinKedList.size=3;main方法運行 結構圖如下:
此時鏈表的結構就已經出來了,就是一個節點接一個節點。
first a節點下的next對象包含了一個節點b,b節點的next對象包含了一個節點c,以此類推的結構。
寫一個get方法:
//get方法 很簡單 根據游標 從第一個節點遍歷尋找值 這里也可以很清楚的看到為什么鏈表查詢慢 不像arrayList那樣查詢快 //因為這里是遍歷 arrayList是直接根據下標從數組取值,所以arrayList查詢要快的多。?public E get(int index) {return node(index).item;}//這里是源碼直接復制過來的 //很巧妙的設計 如果我們查詢的這個值排在隊伍的后半部分, 從后往前找 。小于后半部分 從前往后找 可以提高效率Node<E> node(int index) {if (index < (size >> 1)) {Node<E> x = first;for (int i = 0; i < index; i++)x = x.next;return x;} else {Node<E> x = last;for (int i = size - 1; i > index; i--)x = x.prev;return x;}}最后貼上jdk 原版add 方法:
//這里是jdk里的源碼void add(E e) {final Node<E> l = last;//把最后一個賦予新的對象,第一次是空的final Node<E> newNode = new Node<>(l, e, null);last = newNode;//每一次新加入的節點都是最后一個節點if (l == null) //第一次l是空的first = newNode;//第一個節點就是新加入的節點elsel.next = newNode;//否則l的下一個是新加入的節點 這里有點繞,需要一點點調式,是對象的引用改變了first的指定對象size++;}很巧妙地思想,確實編程思想很重要,在我這個層次確實感覺無法寫出這樣的代碼。只有不斷去學習,借鑒。
總結
以上是生活随笔為你收集整理的手写LinKedList双向链表 终于搞清了什么是链表结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 单文件4g,[史上最伟大网管
- 下一篇: 链表的结构