鏈表(下)—— 6個技巧教你寫出正確的鏈表代碼

技巧一:理解指針或引用的含義

指針或引用存儲的是對象的內存地址。將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針。bash

p->next=q 表示 p 結點中的 next 指針存儲了 q 結點的內存地址。從左到右讀就能夠,p 的下一個結點就是 q。spa

技巧二:警戒指針丟失和內存泄漏

拿單鏈表的插入舉例。在結點 a 和相鄰的結點 b 之間插入 x,假設當前指針 p 指向結點 a。3d

p->next = x;  // 將 p 的 next 指針指向 x 結點;
x-next = p -> next;  // 將 x 的結點的 next 指針指向 b 結點;
複製代碼

很顯然,上面的代碼執行結果有問題。結點 x 最終指向本身,這樣鏈表就斷開了,形成內存泄漏。因此應該顛倒一下順序。指針

在插入結點時,必定要注意操做的順序,這樣纔不會丟失指針。刪除結點時,必定記得手動釋放內存,以避免產生內存泄漏。code

技巧三:利用哨兵簡化實現難度

針對鏈表的插入、刪除操做,須要對插入第一個結點和刪除最後一個結點的狀況進行特殊處理。好比判斷是否爲 null。orm

引入哨兵結點,無論鏈表是否是空,head 指針都會一直指向這個哨兵結點。把這種有哨兵結點的鏈表叫帶頭鏈表。相反。沒有哨兵結點的鏈表就叫做不帶頭鏈表。cdn

哨兵結點是不存儲數據的。由於哨兵結點一直存在,因此插入第一個結點和插入其餘結點,刪除最後一個結點和刪除其餘結點,均可以使用相同的代碼實現邏輯了。對象

技巧四:重點留意邊界條件處理

經常使用來檢查鏈表代碼是否正確的邊界條件:blog

  • 若是鏈表爲空時,代碼是否能正常工做?
  • 若是鏈表只包含一個結點時,代碼是否能正常工做?
  • 若是鏈表只包含兩個結點時,代碼是否能正常工做?
  • 代碼邏輯在處理頭結點和尾結點的時候,是否能正常工做?

實際上,不光是寫鏈表代碼,在寫任何代碼時,也千萬不要只實現業務正常狀況下的功能,必定要多想一想,代碼在運行的時候,可能會遇到哪些邊界狀況或者異常狀況。遇到了應該如何應對,這樣寫出來的代碼纔夠健壯!內存

技巧五:舉例畫圖,輔助思考

你能夠找一個具體的例子,把它畫在紙上,釋放一些腦容量,留更多的給邏輯思考,這樣就會感受到思路清晰不少。

技巧六:多寫多練,沒有捷徑

精選了 5 個常見的鏈表操做,做爲練習的題目。

  • 單鏈表反轉
  • 鏈表中環的檢測
  • 兩個有序的鏈表合併
  • 刪除鏈表倒數第 n 個結點
  • 求鏈表的中間結點
相關文章
相關標籤/搜索