07 | 链表(下):如何轻松写出正确的链表代码?
目錄
技巧一:理解指針或者引用的含義
技巧二:警惕指針丟失和內存泄漏
技巧三:利用哨兵簡化實現難度
技巧四:重點留意邊界條件處理
技巧五:舉例畫圖,輔助思考
技巧六:多寫多練,沒有捷徑
鏈表的概念回顧:
頭結點和頭指針的區別
- 鏈表中第一個結點的存儲位置叫做頭指針,那么整個鏈表的存取就必須是從頭指針開始進行了。之后的每一個結點,其實就是上一個的后繼指針指向的位置。鏈式存儲時只要不是循環鏈表,就一定存在頭指針。
- 頭指針就是鏈表的名字。頭指針僅僅是個指針而已。頭結點是為了操作的統一與方便而設立的,放在第一個元素結點之前,其數據域一般無意義(當然有些情況下也可存放鏈表的長度、用做監視哨等等)。有了頭結點后,對在第一個元素結點前插入結點和刪除第一個結點,其操作與對其它結點的操作統一了
- 頭結點不是鏈表所必需的。
- 頭指針具有標識作用,故常用頭指針冠以鏈表的名字。無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素
寫鏈表代碼是最考驗邏輯思維能力的。因為,鏈表代碼到處都是指針的操作、邊界條件的處理,稍有不慎就容易產生 Bug。鏈表代碼寫得好壞,可以看出一個人寫代碼是否夠細心,考慮問題是否全面,思維是否縝密。所以,這也是很多面試官喜歡讓人手寫鏈表代碼的原因
自己有決心并且付出精力是成功的先決條件,除此之外,我們還需要一些方法和技巧。分享幾個寫鏈表代碼技巧。
技巧一:理解指針或者引用的含義
- 不管是“指針”還是“引用”,實際上,它們的意思都是一樣的,都是存儲所指對象的內存地址。
- 將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針,或者反過來說,指針中存儲了這個變量的內存地址,指向了這個變量,通過指針就能找到這個變量
技巧二:警惕指針丟失和內存泄漏
寫鏈表代碼的時候,指針指來指去,一會兒就不知道指到哪里了。所以,我們在寫的時候,一定注意不要弄丟了指針。
單鏈表的插入操作為例:
- 插入結點時,一定要注意操作的順序
- 要先將結點 x 的 next 指針指向結點 b,再把結點 a 的 next 指針指向結點 x,這樣才不會丟失指針,導致內存泄漏
- 刪除結點時,一定要手動釋放內存
正確的插入操作:
x->next = p->next; // 將x的結點的next指針指向b結點; p->next = x; // 將p的next指針指向x結點;技巧三:利用哨兵簡化實現難度
單鏈表的插入和刪除操作分析:單鏈表的插入操作,第一個結點和其他結點的插入邏輯是不一樣的;
- 向一個空鏈表中插入第一個結點
-
結點 p 后面插入一個新的結點
- 刪除結點 p 的后繼結點
- 刪除鏈表中的最后一個結點
針對鏈表的插入、刪除操作,需要對插入第一個結點和刪除最后一個結點的情況進行特殊處理。這樣代碼實現起來就會很繁瑣,不簡潔,而且也容易因為考慮不全而出錯。
如何表示一個空鏈表嗎?head=null 表示鏈表中沒有結點了。其中 head 表示頭結點指針,指向鏈表中的第一個結點。如果我們引入哨兵結點,在任何時候,不管鏈表是不是空,head 指針都會一直指向這個哨兵結點。我們也把這種有哨兵結點的鏈表叫帶頭鏈表。相反,沒有哨兵結點的鏈表就叫作不帶頭鏈表。
帶頭鏈表的示意圖:
利用哨兵簡化編程難度的技巧,在很多代碼實現中都有用到,比如插入排序、歸并排序、動態規劃等。
技巧四:重點留意邊界條件處理
軟件開發中,代碼在一些邊界或者異常情況下,最容易產生 Bug。鏈表代碼也不例外。要實現沒有 Bug 的鏈表代碼,一定要在編寫的過程中以及編寫完成之后,檢查邊界條件是否考慮全面,以及代碼在邊界條件下是否能正確運行:
檢查鏈表代碼是否正確的邊界條件有以下幾個:
- 如果鏈表為空時,代碼是否能正常工作?
- 如果鏈表只包含一個結點時,代碼是否能正常工作?
- 如果鏈表只包含兩個結點時,代碼是否能正常工作?
- 代碼邏輯在處理頭結點和尾結點的時候,是否能正常工作?
實際上,不光光是寫鏈表代碼,你在寫任何代碼時,也千萬不要只是實現業務正常情況下的功能就好了,一定要多想想,你的代碼在運行的時候,可能會遇到哪些邊界情況或者異常情況。遇到了應該如何應對,這樣寫出來的代碼才夠健壯!
技巧五:舉例畫圖,輔助思考
微復雜的鏈表操作,比如前面我們提到的單鏈表反轉,指針一會兒指這,一會兒指那,一會兒就被繞暈了。總感覺腦容量不夠,想不清楚。所以這個時候就要使用大招了,舉例法和畫圖法。
技巧六:多寫多練,沒有捷徑
精選了 5 個常見的鏈表操作。你只要把這幾個操作都能寫熟練,不熟就多寫幾遍,我保證你之后再也不會害怕寫鏈表代碼。
- 單鏈表反轉
- 鏈表中環的檢測
- 兩個有序的鏈表合并
- 刪除鏈表倒數第 n 個結點
- 求鏈表的中間結點
以上幾個操作的代碼后面更新補充
總結
以上是生活随笔為你收集整理的07 | 链表(下):如何轻松写出正确的链表代码?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10隐藏桌面功能
- 下一篇: 无为职业学校计算机班,致盐亭职中2000