算法精講學習筆記 鏈表


1.鏈表有關的知識

(1)鏈表問題算法難度不高,主要考察代碼實現能力

(2)鏈表和數組都是一種線性結構

數組是一段連續分配的存儲空間,
鏈表空間不一定保證連續,是臨時分配的。

(3)鏈表的分類

按鏈接方向分類:單鏈表、雙鏈表
按有環無環分類:普通鏈表、循環鏈表

循環鏈表是首尾相接的鏈表,它的最后一個元素的next指針指向它的第一個元素,

另外還有一種循環雙鏈表,它的頭節點還有一個指針指向它的最后一個元素。

(4)鏈表問題代碼實現的關鍵

a.鏈表函數的返回值類型,要求往往是節點類型
b.處理鏈表過程中,先采用畫圖的方式理清邏輯,對解答很有幫助
c.鏈表問題對於邊界條件討論要求嚴格

(5)鏈表插入和刪除的注意事項

a.特殊處理鏈表為空,或者鏈表長度為1的情況
b.注意插入操作的調整過程

頭尾節點和空節點的注意。

(6)單鏈表的翻轉操作

a.當鏈表為空,或者長度為1時,特殊處理。
b.對於一般情況的操作如下:
首先用一個變量記錄now結點的指向的下一個結點,
然后將now節點的next指針指向當前鏈表的head結點,
將now節點設置為翻轉部分的新的頭結點,
最后根據之前的變量記錄,重復進行這個操作。

(7)關於額外空間的注意事項

大量鏈表問題可以使用額外數據結構來簡化調整過程,
但鏈表問題最優解往往不是使用額外數據結構的方法。
很多問題都有空間復雜度為O(1)的解法。

2.環形鏈表插值問題

給定一個整數num,如何在節點值有序的環形鏈表中插入一個節點為num的節點,並且保證這個環形單鏈表依然有序。

首先生成節點值為num的節點node,

(1)如果鏈表為空

將node的next指針指向自己,返回node即可。

(2)如果鏈表不為空

令變量previous等於頭結點,變量ncurrent等於頭結點的下一個節點,兩個指針同步移動下去,如果遇到p.value<=num,c.value>=num,

就把node插入其中,將node的prev指針指向當前的p,next指針指向當前的c即可。

(3)如果p和c轉一圈都沒有發現應該插入的位置,其實此時node的值應該是比鏈表中所有的值都大,或者都小,應該插入頭節點的前面。但是注意,因為需要保證有序,所以兩種情況下,鏈表的頭部是不一樣的

3.訪問單個節點的鏈表刪除題目

給定一個鏈表中的節點node,但不給定整個鏈表的頭節點,如何在鏈表中刪除node?要求時間復雜度為O(1),實現這個函數。

(1)如果是雙鏈表比較簡單,當前節點可以通過prev和next指針找到前后的節點,刪除這個節點只需要將node的前后節點重新連接即可。
(2)單鏈表無法通過當前節點找到之前的節點,此時可以使用下面的思路。

比如原始鏈表為1——>2——>3——>null,要刪除節點2,但不知道頭結點,
只要把節點2的值換成節點3的值,再鏈表中刪掉節點3即可。
這種刪除方式並不是刪除了該刪除的節點,而是進行了值的拷貝。
但是需要注意特殊情況:
如果要刪除最后一個節點,因為節點3后面為空,只能將它刪除,但找不到節點來替換,於是節點2的next指針不能指向null,刪除失敗。並且如果將節點3的值置為null,同樣也是不可以的,此時節點2的指針仍然不是指向null。

 也就是說這道題目經常出現,但是題目本身是不完備的。

 

 內容來自左程雲老師在牛客網的算法課程


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com