先說特性,再說原始碼(有這特性的原因),後說應用場合。
四、remove()
五、查詢方法
六、棧和佇列的操作
後說應用
linedlist實現了deque、queue、list 介面,可用於構造 棧、佇列、有序集合(序列)。
一、成員變數
//一開始是個空鍊錶
transient int size = 0;
//頭結點
transient nodefirst;
//尾結點
transient nodelast;
其中,鍊錶的結點是個雙向結點,linkedlist也因此稱為雙向鍊錶。
二、結點是靜態內部類
private static class node
}
node結點有 prev指標、 item(資料)、next指標。
linkedlist易於增加和刪除的原因:憑藉結點的prev(指向前驅結點)和next(指向下乙個結點),只需要修改這兩個指標的指向就能輕鬆地在鍊錶頭部和尾部增加刪除結點。
關於建構函式,只有乙個預設構造,就跳過吧。
三、add:把元素放到鍊錶末尾
add(e e)
:鍊錶尾部新增乙個元素
addall(int index, collection extends e> c)
:鍊錶指定位置新增乙個集合
add(e e)
public
boolean
add(e e)
void
linklast
(e e)
需要注意的是:鍊錶沒有元素的時候,頭結點first和尾結點last都是null,所以判斷if (l == null) first = newnode;
是說當鍊錶新增第乙個元素時,頭結點first和尾結點last都是新元素newnode。
如果鍊錶不空,就讓原鍊錶的尾結點last的next指標指向新元素,這時新元素就成為了鍊錶的最後乙個元素了。
addall(int index, collection extends e> c):在某個位置新增乙個集合的內容
public boolean addall(int index, collection extends e> c) else
//遍歷要新增內容的陣列
for (object o : a)
//新增完後需要修改尾指標 last
if (succ == null) else
//統計元素個數
size += numnew;
modcount++;
return true;
}
具體流程如下圖:
四、remove()
有多種刪除結點的api
e remove(int index)
刪除指定位置結點。
boolean remove(object o)
刪除某個元素
removefirst()
:刪除煉表頭。removelast()
:刪除鍊錶尾。
remove(int index):刪除指定位置結點
public e remove
(int index)
e unlink
(node
x)else
//如果後面沒有節點,說 x 是最後乙個節點
if(next == null)
else
x.item = null;
size--
; modcount++
;return element;
}
unlink要先判斷待刪除結點x是否在鍊錶頭部或尾部:
若x在頭部if (prev == null) first = next;
,讓x的下乙個結點成為新的頭結點first 。
若x在尾部if (next == null) last = prev;
,讓x的前乙個結點成為新的尾結點last。
在其他位置見下圖。
remove(object o):刪除指定元素
鍊錶刪除指定元素object o要遍歷+equals()比較,如果匹配再呼叫剛才的e unlink(nodex)
。
public
boolean
remove
(object o)}}
else}}
return
false
;}
removefirst():刪除煉表頭並返回刪除的元素public e removefirst()
private e unlinkfirst(nodef)
判斷鍊錶是否為空的標誌:last = null 或者 first=null
,哪怕鍊錶有乙個結點,first和last都不會為null。如果鍊錶有多個元素,刪除頭結點後會讓頭結點first=原頭結點的下乙個結點。
五、查詢方法
列舉了2個常用的查詢api
獲取指定位置的元素:get(int index)
獲取元素的下標:indexof(object o)
get(int index):獲取指定位置的元素
// 1. 獲取指定位置的元素get(int index):要遍歷
public e get
(int index)
node
node
(int index)
else
}
為了保證查詢的效率,最多隻查詢鍊錶的其中一半:
int indexof(object o):獲取元素的第一次出現的下標
public
intindexof
(object o)
}else
}return-1
;}
linkedlist也允許所有元素,包括null。從頭結點開始遍歷,找第乙個出現的元素的下標。
六、棧和佇列的操作
棧的操作實現(後進先出)
主要在linkedlist的頭部操作,涉及到peek()、 push(e e)、pop()
//獲取第乙個(棧頂),但不刪除元素
public e peek()
//入棧,linkedlist在頭部新增元素
public void push(e e)
//出棧,linkedlist刪除頭部元素,具體操作是在上文的removefirst的unlinkfirst()方法裡
public e pop()
佇列的實現(先進先出)
可以選擇在linkedlist尾部進,頭部出,涉及到的方法有element()獲得佇列頭、offer(e)插入佇列尾、peek()獲得佇列頭、remove()刪除佇列頭
//獲得佇列頭
public e element()
//在尾部新增
public boolean offer(e e)
//移除並返回佇列頭部
public e poll()
//移除佇列頭部
public e remove()
佇列的實現有些不同,存在兩個獲取佇列頭部的方法:element() 、peek()
,它們的區別是: 看QtDesigner原始碼
畢業有一年半了,很早就想著寫部落格,可是水平有限,表達能力也差好多,但是現在總結來說,好多東西都忘了,浪費了好多時間,所以開始寫東西吧。1.pro檔案檢視專案構成 template subdirs config qt subdirs src 樣板 模板 型板 就是乙個模板,然後我在data資料夾裡看...
jQuery原始碼研究 怎麼看原始碼
這幾天有想看原始碼的想法,於是就開始了原始碼的研究,經過幾天的摸索發現看原始碼還是有點技巧在裡面的,想著把這些東東寫下來作為乙個小總結。在乙個多月前我對vue原始碼進行了一次研究,那時看原始碼的方式基本上是從上往下看,結果看著看著就看不下去了,後來找了乙個很老的版本看,但看的還是不太懂,於是想著乾脆...
nginx原始碼分析 從原始碼看nginx框架總結
nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...