国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

LinkedList數(shù)據(jù)結(jié)構(gòu)與源碼分析

2019-11-14 10:31:54
字體:
供稿:網(wǎng)友

LinkedList

LinkedList繼承AbstractSequentialList,實現(xiàn)了接口List,Queue,Deque, Clonealbe, Serializable內(nèi)部有一個數(shù)據(jù)結(jié)構(gòu)Link用來表示LinkedList中的一個節(jié)點,該節(jié)點保存 數(shù)據(jù)信息前后兩個指針內(nèi)部類LinkIterator,實現(xiàn)LinkList的雙向遍歷內(nèi)部類ReverseLinkIterator, 實現(xiàn)LinkedList逆向遍歷

LinkedList增加元素

構(gòu)造方法,注意此時LinkedList的size還是默認值0。public LinkedList() { voidLink = new Link<E>(null, null, null); voidLink.PRevious = voidLink; voidLink.next = voidLink; }

這里寫圖片描述 2. 在尾部增加元素, 該方法比較簡單, 雖然看上去有兩個節(jié)點,但是voidLink并不是我們需要的,只是為了方便維護指針而存在的。所以此時size == 1

private boolean addLastImpl(E object) { Link<E> oldLast = voidLink.previous; // 1 Link<E> newLink = new Link<E>(object, oldLast, voidLink); // 2 voidLink.previous = newLink; // 3 oldLast.next = newLink; // 4 size++; modCount++; return true; }private static final class Link<ET> { ET data; Link<ET> previous, next; Link(ET o, Link<ET> p, Link<ET> n) { data = o; previous = p; next = n; } }

這里寫圖片描述 如果繼續(xù)在尾部增加節(jié)點,效果圖如下,此時size == 2 這里寫圖片描述 3. 下面看一個復(fù)雜一點的add方法

@Overridepublic void add(int location, E object) { if (location >= 0 && location <= size) { /**注意這里一定要使用一個新的指針,后面移動的也是這個新的指針link, 一定要在一個LinkedList的pos==0的元素的前面**/ Link<E> link = voidLink; /**這個if else 語句主要解決插入位置不在結(jié)尾時 (在結(jié)尾時,執(zhí)行到else,但是里面的for循環(huán)是不會執(zhí)行的, 其i>location是不滿足的),沿著voidLink的next指針的方向(if語句做的事情), 或者沿著voidLink的previous的指針方向(else語句的方向),找到location的位置, 將上一步指向最voidLink的指針link移動到指定的位置, 這里為了速度, 看插入位置離頭部近就從前向后找,離尾部近就從尾部向頭部尋找。*/ if (location < (size / 2)) { for (int i = 0; i <= location; i++) { link = link.next; } } else { for (int i = size; i > location; i--) { link = link.previous; } } /**-------------后面的和前面說的addLastImpl都一樣--------------**/ Link<E> previous = link.previous; Link<E> newLink = new Link<E>(object, previous, link); previous.next = newLink; link.previous = newLink; size++; modCount++; } else { throw new IndexOutOfBoundsException(); }}

4.在頭部增加元素addFirstImpl和addLastImpl類似 5.clear方法,回復(fù)成voidLink最初的樣子

@Overridepublic void clear() { if (size > 0) { size = 0; voidLink.next = voidLink; voidLink.previous = voidLink; modCount++; }}

這里寫圖片描述 6. addAll方法可以在指定位置增加集合,另外,該集合可以是自己 7. contains方法需找元素equals那個,LinkedList中的元素允許為空

@Overridepublic boolean contains(Object object) { Link<E> link = voidLink.next; if (object != null) { while (link != voidLink) { if (object.equals(link.data)) { return true; } link = link.next; } } else { while (link != voidLink) { if (link.data == null) { return true; } link = link.next; } } return false;}

8.返回第一個元素, 返回最后一個元素方法類似,省略不說

private E getFirstImpl() { Link<E> first = voidLink.next; if (first != voidLink) { return first.data; } throw new NoSuchElementException();}

9.indexOf和lastIndexOf兩個方法從前向后和從后向前遍歷,找到equals那個元素,找不到則返回-1


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 德州市| 承德市| 南昌市| 拜城县| 民乐县| 阳谷县| 昌乐县| 盐池县| 镇宁| 新源县| 汽车| 馆陶县| 齐齐哈尔市| 靖西县| 永登县| 屏山县| 自贡市| 河南省| 合江县| 山西省| 娱乐| 响水县| 陆丰市| 巴彦淖尔市| 太仓市| 于都县| 乐东| 牙克石市| 溆浦县| 伊金霍洛旗| 吴江市| 栾城县| 阳泉市| 乌苏市| 浏阳市| 乾安县| 孟州市| 沙湾县| 新河县| 逊克县| 安义县|