如何寫好鏈表代碼?

前述

鏈表代碼不好寫,初學(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)證代碼是否正確。

  1. 如果鏈表是空,代碼有無(wú) bug?
  2. 如果鏈表只有一個(gè)節(jié)點(diǎn),代碼有無(wú) bug?
  3. 如果鏈表只有 2 個(gè)節(jié)點(diǎn),代碼有無(wú) bug?
  4. 代碼處理 head 和 tail 時(shí),有無(wú) bug?

5 舉例畫圖,輔助思考

簡(jiǎn)單說,就是多畫圖。減輕大腦壓力。

6. 最后,多寫多練 ,沒有捷徑

leetcode 刷起來!!!!

下面是 5 個(gè)常見題目,熟練這 5 個(gè)題目,鏈表也就熟練了:

  1. 單鏈表反轉(zhuǎn)
  2. 鏈表中環(huán)的檢測(cè)
  3. 兩個(gè)有序的鏈表合并
  4. 刪除鏈表中倒數(shù)第 n 個(gè)節(jié)點(diǎn)
  5. 求鏈表的中間節(jié)點(diǎn)

小結(jié)

寫鏈表是最考驗(yàn)邏輯思維能力的。鏈表代碼到處都是指針操作,邊界處理。一不小心就會(huì)采坑。這需要很多的練習(xí)和縝密的思考才能寫出 bug free 的代碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 鏈表(下):如何輕松寫出正確的鏈表代碼? 上一節(jié)我講了鏈表相關(guān)的基礎(chǔ)知識(shí)。學(xué)完之后,我看到有人留言說,基礎(chǔ)知識(shí)我都...
    GhostintheCode閱讀 1,314評(píng)論 2 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,132評(píng)論 1 32
  • 搞懂單鏈表常見面試題 Hello 繼上次的 搞懂基本排序算法,這個(gè)一星期,我總結(jié)了,我所學(xué)習(xí)和思考的單鏈表基礎(chǔ)知識(shí)...
    醒著的碼者閱讀 4,608評(píng)論 1 45
  • (上)如何實(shí)現(xiàn)LRU緩存淘汰算法? 一、什么是鏈表? 1.和數(shù)組一樣,鏈表也是一種線性表。2.從內(nèi)存結(jié)構(gòu)來看,鏈表...
    碼語(yǔ)生活閱讀 323評(píng)論 0 0
  • 理解指針或引用的含義 含義:將某個(gè)變量(對(duì)象)賦值給指針(引用),實(shí)際上就是就是將這個(gè)變量(對(duì)象)的地址賦值給指針...
    胡子先生丶閱讀 323評(píng)論 0 1