指針或引用存儲的是對象的內存地址。將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針。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 個常見的鏈表操做,做爲練習的題目。