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