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