日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

07 | 链表(下):如何轻松写出正确的链表代码?

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 07 | 链表(下):如何轻松写出正确的链表代码? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

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

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

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

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

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

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


鏈表的概念回顧:

頭結點和頭指針的區別

  • 鏈表中第一個結點的存儲位置叫做頭指針,那么整個鏈表的存取就必須是從頭指針開始進行了。之后的每一個結點,其實就是上一個的后繼指針指向的位置。鏈式存儲時只要不是循環鏈表,就一定存在頭指針。
  • 頭指針就是鏈表的名字。頭指針僅僅是個指針而已。頭結點是為了操作的統一與方便而設立的,放在第一個元素結點之前,其數據域一般無意義(當然有些情況下也可存放鏈表的長度、用做監視哨等等)。有了頭結點后,對在第一個元素結點前插入結點和刪除第一個結點,其操作與對其它結點的操作統一了
  • 頭結點不是鏈表所必需的。
  • 頭指針具有標識作用,故常用頭指針冠以鏈表的名字。無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素

寫鏈表代碼是最考驗邏輯思維能力的。因為,鏈表代碼到處都是指針的操作、邊界條件的處理,稍有不慎就容易產生 Bug。鏈表代碼寫得好壞,可以看出一個人寫代碼是否夠細心,考慮問題是否全面,思維是否縝密。所以,這也是很多面試官喜歡讓人手寫鏈表代碼的原因

自己有決心并且付出精力是成功的先決條件,除此之外,我們還需要一些方法和技巧。分享幾個寫鏈表代碼技巧。

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

  • 不管是“指針”還是“引用”,實際上,它們的意思都是一樣的,都是存儲所指對象的內存地址
  • 將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針,或者反過來說,指針中存儲了這個變量的內存地址,指向了這個變量,通過指針就能找到這個變量

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

寫鏈表代碼的時候,指針指來指去,一會兒就不知道指到哪里了。所以,我們在寫的時候,一定注意不要弄丟了指針。

單鏈表的插入操作為例:

  • 插入結點時,一定要注意操作的順序
  • 要先將結點 x 的 next 指針指向結點 b,再把結點 a 的 next 指針指向結點 x,這樣才不會丟失指針,導致內存泄漏
  • 刪除結點時,一定要手動釋放內存

正確的插入操作:

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

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

單鏈表的插入和刪除操作分析:單鏈表的插入操作,第一個結點和其他結點的插入邏輯是不一樣的;

  • 向一個空鏈表中插入第一個結點
if (head == null) {head = new_node; }
  • 結點 p 后面插入一個新的結點

new_node->next = p->next; p->next = new_node;
  • 刪除結點 p 的后繼結點
p->next = p->next->next;
  • 刪除鏈表中的最后一個結點
if (head->next == null) {head = null; }

針對鏈表的插入、刪除操作,需要對插入第一個結點和刪除最后一個結點的情況進行特殊處理。這樣代碼實現起來就會很繁瑣,不簡潔,而且也容易因為考慮不全而出錯。

如何表示一個空鏈表嗎?head=null 表示鏈表中沒有結點了。其中 head 表示頭結點指針,指向鏈表中的第一個結點。如果我們引入哨兵結點,在任何時候,不管鏈表是不是空,head 指針都會一直指向這個哨兵結點。我們也把這種有哨兵結點的鏈表叫帶頭鏈表。相反,沒有哨兵結點的鏈表就叫作不帶頭鏈表。

帶頭鏈表的示意圖:

利用哨兵簡化編程難度的技巧,在很多代碼實現中都有用到,比如插入排序、歸并排序、動態規劃等。

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

軟件開發中,代碼在一些邊界或者異常情況下,最容易產生 Bug。鏈表代碼也不例外。要實現沒有 Bug 的鏈表代碼,一定要在編寫的過程中以及編寫完成之后,檢查邊界條件是否考慮全面,以及代碼在邊界條件下是否能正確運行:

檢查鏈表代碼是否正確的邊界條件有以下幾個

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

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

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

微復雜的鏈表操作,比如前面我們提到的單鏈表反轉,指針一會兒指這,一會兒指那,一會兒就被繞暈了。總感覺腦容量不夠,想不清楚。所以這個時候就要使用大招了,舉例法和畫圖法。

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

精選了 5 個常見的鏈表操作。你只要把這幾個操作都能寫熟練,不熟就多寫幾遍,我保證你之后再也不會害怕寫鏈表代碼。

  • 單鏈表反轉
  • 鏈表中環的檢測
  • 兩個有序的鏈表合并
  • 刪除鏈表倒數第 n 個結點
  • 求鏈表的中間結點

以上幾個操作的代碼后面更新補充

總結

以上是生活随笔為你收集整理的07 | 链表(下):如何轻松写出正确的链表代码?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。