摘要:類鏈表容器也是通過對比源碼進行對比學習。增加一個結點不帶,直接尾插法當鏈表里沒有一個元素時,頭尾都是該結點,并且該結點的前后都是空的。尾結點是該結點的前驅結點,該結點是尾節點的后繼結點,更新尾節點。
LinkedList類 鏈表容器也是通過對比jdk源碼進行對比學習。 1.定義結點類型
class Node
E item; Nodenext; Node prev; Node(Node prev,E item,Node next){ this.prev=prev; this.next=next; this.item=item; } Node(E item){ this.item=item; }
}
private static class Node
E item; Nodenext; Node prev; Node(Node prev, E element, Node next) { this.item = element; this.next = next; this.prev = prev; }
}
(1)Node的訪問權限是private的,因為這這是鏈表內部使用的結點類。
(2)一開始不理解結點的構造函數為什么要傳入prev和next,但其實就是結點的最簡單的全參構造,不知道時傳null即可,等結點插入鏈表時再賦值即可。
2.增加一個結點(不帶index,直接尾插法)public void add(Node
if(first==null){//當鏈表里沒有一個元素時,頭尾都是該結點,并且該結點的前后都是空的。 first=node; last=node; node.prev=null; node.next=null; } else {//尾結點是該結點的前驅結點,該結點是尾節點的后繼結點,更新尾節點。 node.prev=last; last.next=node; last=node; } size++;//鏈表長度增加。
}
1.如果是第一個結點,把它同時給first和last,并且這個結點的前后都是空。
2.如果不是第一個結點,先把鏈表中的last給這個結點的前驅,把這個結點給鏈表里last的后繼,然后更新鏈表里的last結點為當前的node。
void linkLast(E e) {
final Nodel = last; final Node newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++;
}
(1)插入時傳入的應該是數據,把數據封裝成結點的事應該讓內部去做(這也就是解釋了一開始自己的疑惑,源碼的第二行封裝結點時就是前驅傳入了鏈表的last,后繼傳了null)
(2)其余邏輯差別不大。
3.刪除一個結點(帶index)public void delete(int index){
size--; Nodecurrent=first; for(int i=1;i<=index-1;i++){ current = current.next; } if(current.equals(first)){ first=current.next; } if (current.equals(last)){ last=current.prev; } else { current.prev.next = current.next; current.next.prev = current.prev; }
}
(都暫不考慮范圍問題)
分析:頭尾位置多帶帶考慮,其余位置指針指向對應改變即可。E unlink(Node
final E element = x.item; final Nodenext = x.next; final Node prev = x.prev; if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; modCount++; return element;
}
邏輯基本相同,此外,刪除時有這么個操作
f.item = null;
f.next = null; // help GC
help gc 的小方針。
4.修改一個結點的數據(1)遍歷找到這個index結點
(2)修改item即可
5.查找指定數據(1)遍歷找到這個index結點
(2)拿出item
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77701.html
摘要:找工作之前看了很多面試題,復習資料,但是發現純看面試題是不行的,因為靠背的東西是記不牢的,需要知識成體系才可以,所以筆者整理了一份復習大綱,基本涵蓋了中高級工程師面試所必須知識點,希望可以通過此文幫助一些想換工作的朋友更好的復習,準備面試。 概述 都說金三銀四青銅五,這幾個月份是程序員最好的跳槽時間,筆者四月初也換了工作。找工作之前看了很多面試題,復習資料,但是發現純看面試題是不行的,因為靠...
摘要:是現在廣泛流行的代從開始學習系列之向提交代碼掘金讀完本文大概需要分鐘。為了進行高效的垃圾回收,虛擬機把堆內存劃分成新生代老年代和永久代中無永久代,使用實現三塊區域。 React Native 開源項目 - 仿美團客戶端 (Android、iOS 雙適配) - Android - 掘金推薦 React Native 學習好項目,仿照美團客戶端... 極簡 GitHub 上手教程 - 工具...
摘要:把內存分成兩種,一種叫做棧內存,一種叫做堆內存在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。堆內存用于存放由創建的對象和數組。 一次慘痛的阿里技術面 就在昨天,有幸接到了阿里的面試通知,本來我以為自己的簡歷應該不會的到面試的機會了,然而機會卻這么來了,我卻沒有做好準備,被面試官大大一通血虐。因此,我想寫點東西紀念一下這次的經歷,也當一次教訓了。其實面試官大大...
閱讀 2133·2021-11-22 15:24
閱讀 2428·2021-09-09 11:53
閱讀 3047·2021-09-04 16:40
閱讀 1646·2019-08-30 15:52
閱讀 3366·2019-08-29 13:47
閱讀 2747·2019-08-26 17:40
閱讀 1554·2019-08-26 13:24
閱讀 2255·2019-08-26 12:01