06數(shù)據(jù)結(jié)構(gòu)之鏈表下

本文介紹幾個(gè)寫鏈表代碼技巧

1. 理解指針或引用的含義

將某個(gè)變量(對象)賦值給指針(引用), 實(shí)際上就是將這個(gè)變量(對象)的地址賦值給指針(引用),也可以反過來說,指針(yiny)中存儲了這個(gè)變量的內(nèi)存地址,指向了這個(gè)變量,通過指針就能找到這個(gè)變量。比如:

  • p->next = q, 意思是p結(jié)點(diǎn)中的next指針存儲了q結(jié)點(diǎn)的內(nèi)存地址。
  • p->next = p->next->next表示p結(jié)點(diǎn)的next指針存儲了p結(jié)點(diǎn)的下下一個(gè)結(jié)點(diǎn)的內(nèi)存地址
2. 警惕指針丟失和內(nèi)存泄漏

在寫鏈表的時(shí)候,一定要

3.利用哨兵簡化實(shí)現(xiàn)難度
  1. 什么是“哨兵”?
    鏈表中的“哨兵”結(jié)點(diǎn)是解決邊界問題的,不參與業(yè)務(wù)邏輯,如果我們引用“哨兵”結(jié)點(diǎn),則不管鏈表是否為空,head指針都是指向這個(gè)"哨兵"結(jié)點(diǎn),我們把這種有“哨兵”結(jié)點(diǎn)的鏈表成為帶頭鏈表,相反,如果沒有“哨兵”結(jié)點(diǎn)就稱為不帶頭鏈表
    2.在鏈表中引入“哨兵”
    “哨兵”節(jié)點(diǎn)不存儲數(shù)據(jù),無論鏈表是否為空,head指針都會指向它,作為鏈表的頭結(jié)點(diǎn)始終存在。這樣,插入第一個(gè)節(jié)點(diǎn)和插入其他節(jié)點(diǎn),刪除最后一個(gè)節(jié)點(diǎn)和刪除其他節(jié)點(diǎn)都可以統(tǒng)一為相同的代碼實(shí)現(xiàn)邏輯了。
  2. 哨兵的應(yīng)用
    暫時(shí)就自己知道的,貌似有的排序的算法也可以利用(后面去詳細(xì)了解一下?。?/li>
4.重點(diǎn)留意邊界條件處理

在完成鏈表代碼后,可以用一下幾個(gè)邊界條件檢查代碼是否正確:

  • 如果鏈表為空時(shí),代碼是否能正常工作。
  • 如果鏈表只包含一個(gè)結(jié)點(diǎn)時(shí),代碼是否能正常工作。
  • 如果鏈表只包含兩個(gè)結(jié)點(diǎn)時(shí),代碼是否能正常工作。
  • 代碼邏輯在處理頭結(jié)點(diǎn)和尾結(jié)點(diǎn)的時(shí)候,是否能正常工作。
    除此之外,針對不同的場景,可能還有特定的邊界條件,這個(gè)需要自己去思考,實(shí)際上, 不光是寫鏈表,寫任何代碼,一定要多想想,你的代碼在運(yùn)行的時(shí)候,可能會遇到哪些邊界情況或者異常情況。遇到了應(yīng)該如何應(yīng)對,這個(gè)寫出來的代碼才夠健壯。
5.舉例畫圖,輔助思考
6.多寫多練,沒有捷徑
  1. 5個(gè)常見的鏈表操作
    1. 單鏈表反轉(zhuǎn)
    2. 鏈表中環(huán)的檢測
    3. 兩個(gè)有序鏈表的合并
    4. 刪除鏈表倒數(shù)第n個(gè)結(jié)點(diǎn)
    5. 求鏈表的中間結(jié)點(diǎn)
      很多鏈表在邏輯上并沒有什么復(fù)雜的,最重要的還是能夠用代碼bug free的實(shí)現(xiàn)出來,多寫多練。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容