前述
鏈表代碼不好寫,初學(xué)者經(jīng)常容易出錯(cuò)。掌握以下幾個(gè)規(guī)則,可能可以提高編寫鏈表的技術(shù)。
一共 6 個(gè)技巧:
1. 理解指針或引用的含義
對(duì)一個(gè)引用進(jìn)行賦值,其實(shí)就是將這個(gè)變量的地址保存到這個(gè)引用中。
例如 int a = "100",就是將 “100” 的實(shí)際地址,保存到了 a 的引用中。
2 警惕指針丟失
下面有一段鏈表插入的代碼
a.next = x; // 將 a 的 next 指向 x。
x.next = a.next; // 將 x 的 next 指向 b。
這段代碼實(shí)際上發(fā)生了錯(cuò)誤。即所謂的指針丟失,如果這么寫,那么 b 節(jié)點(diǎn)就會(huì)丟失。
而要修復(fù)這個(gè) bug,只需將上下代碼調(diào)換順序即可。
3 利用哨兵簡(jiǎn)化實(shí)現(xiàn)難度
傳統(tǒng)鏈表,當(dāng)新增數(shù)據(jù)時(shí),需要做以下判斷:
if(head == null){
head = new LinkedNode(x);
}
當(dāng)刪除數(shù)據(jù)時(shí),也需要做判斷:
if(head.next == null){
head = null;
}
如果將 head 做為虛擬節(jié)點(diǎn),那么就不用做這些判斷,就可以提高代碼的美感。
如下圖:
4 重點(diǎn)留意邊界處理
寫完鏈表代碼時(shí),可以思考以下幾個(gè)問題,來驗(yàn)證代碼是否正確。
- 如果鏈表是空,代碼有無(wú) bug?
- 如果鏈表只有一個(gè)節(jié)點(diǎn),代碼有無(wú) bug?
- 如果鏈表只有 2 個(gè)節(jié)點(diǎn),代碼有無(wú) bug?
- 代碼處理 head 和 tail 時(shí),有無(wú) bug?
5 舉例畫圖,輔助思考
簡(jiǎn)單說,就是多畫圖。減輕大腦壓力。
6. 最后,多寫多練 ,沒有捷徑
leetcode 刷起來!!!!
下面是 5 個(gè)常見題目,熟練這 5 個(gè)題目,鏈表也就熟練了:
- 單鏈表反轉(zhuǎn)
- 鏈表中環(huán)的檢測(cè)
- 兩個(gè)有序的鏈表合并
- 刪除鏈表中倒數(shù)第 n 個(gè)節(jié)點(diǎn)
- 求鏈表的中間節(jié)點(diǎn)
小結(jié)
寫鏈表是最考驗(yàn)邏輯思維能力的。鏈表代碼到處都是指針操作,邊界處理。一不小心就會(huì)采坑。這需要很多的練習(xí)和縝密的思考才能寫出 bug free 的代碼。