連結串列(下)—— 6個技巧教你寫出正確的連結串列程式碼
技巧一:理解指標或引用的含義
指標或引用儲存的是物件的記憶體地址。將某個變數賦值給指標,實際上就是將這個變數的地址賦值給指標。
p->next=q 表示 p 結點中的 next 指標儲存了 q 結點的記憶體地址。從左到右讀就可以,p 的下一個結點就是 q。
技巧二:警惕指標丟失和記憶體洩漏
拿單鏈表的插入舉例。在結點 a 和相鄰的結點 b 之間插入 x,假設當前指標 p 指向結點 a。

p->next = x;// 將 p 的 next 指標指向 x 結點; x-next = p -> next;// 將 x 的結點的 next 指標指向 b 結點;
很顯然,上面的程式碼執行結果有問題。結點 x 最終指向自己,這樣連結串列就斷開了,造成記憶體洩漏。所以應該顛倒一下順序。
在插入結點時,一定要注意操作的順序,這樣才不會丟失指標。刪除結點時,一定記得手動釋放記憶體,以免產生記憶體洩漏。
技巧三:利用哨兵簡化實現難度
針對連結串列的插入、刪除操作,需要對插入第一個結點和刪除最後一個結點的情況進行特殊處理。比如判斷是否為 null。
引入哨兵結點,不管連結串列是不是空,head 指標都會一直指向這個哨兵結點。把這種有哨兵結點的連結串列叫帶頭連結串列。相反。沒有哨兵結點的連結串列就叫作不帶頭連結串列。
哨兵結點是不儲存資料的。因為哨兵結點一直存在,所以插入第一個結點和插入其他結點,刪除最後一個結點和刪除其他結點,都可以使用相同的程式碼實現邏輯了。

技巧四:重點留意邊界條件處理
常用來檢查連結串列程式碼是否正確的邊界條件:
- 如果連結串列為空時,程式碼是否能正常工作?
- 如果連結串列只包含一個結點時,程式碼是否能正常工作?
- 如果連結串列只包含兩個結點時,程式碼是否能正常工作?
- 程式碼邏輯在處理頭結點和尾結點的時候,是否能正常工作?
實際上,不光是寫連結串列程式碼,在寫任何程式碼時,也千萬不要只實現業務正常情況下的功能,一定要多想想,程式碼在執行的時候,可能會遇到哪些邊界情況或者異常情況。遇到了應該如何應對,這樣寫出來的程式碼才夠健壯!
技巧五:舉例畫圖,輔助思考
你可以找一個具體的例子,把它畫在紙上,釋放一些腦容量,留更多的給邏輯思考,這樣就會感覺到思路清晰很多。
技巧六:多寫多練,沒有捷徑
精選了 5 個常見的連結串列操作,作為練習的題目。
- 單鏈表反轉
- 連結串列中環的檢測
- 兩個有序的連結串列合併
- 刪除連結串列倒數第 n 個結點
- 求連結串列的中間結點
自己是從事了七年開發的Android工程師,不少人私下問我,2019年Android進階該怎麼學,方法有沒有?
沒錯,年初我花了一個多月的時間整理出來的學習資料,希望能幫助那些想進階提升Android開發,卻又不知道怎麼進階學習的朋友。【 包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全