鍊錶及經典問題
鍊錶及經典問題
第一周 - 鍊錶及經典問題
(1)鍊錶的基礎知識鍊錶的結構
訪問鍊錶的時間複雜度幾種經典的鍊錶實現方法
(2)鍊錶的典型應用場景
(3)經典面試題鍊錶的訪問鍊錶的反轉
鍊錶的節點刪除
(4)彩蛋習題及相關說明
(1)鍊錶的基礎知識
鍊錶的結構
節點資料域指標域
實現方式包括位址、下標(相對位址)、引用
鏈狀結構
通過指標域的值形成了乙個線性結構
訪問鍊錶的時間複雜度
鍊錶不適合快速的定位資料,適合動態的插入和刪除的應用場景。
查詢節點o(th)插入節點o(1) 刪除節點o(1)
幾種經典的鍊錶實現方法
傳統方法(節點+指標) 使用陣列模擬
指標域和資料域分離
利用陣列存放下標進行索引
……(2)鍊錶的典型應用場景
作業系統內的動態記憶體分配
lru快取淘汰演算法
lru = least recethtly used(近期最少使用)快取是一種高速的資料結構。
裝置間存在速度差異,可以通過將使用較多的資料存放在高速區域,而將使用較少的內容存放
在相對低速的區域的方式,來對系統進行優化。
(3)經典面試題
鍊錶的訪問
leetcode #141 環狀鍊錶
思路1:使用雜湊表(額外的儲存區)儲存已經遍歷過的節點思路2:雙指標做法
使用快慢指標 快指標一次向前2個節點 慢指標一次向前1個節點
有環的鍊錶中 快指標和慢指標最終一定會在環中相遇
無環的鍊錶中 快指標會率先訪問到鍊錶尾 從而終結檢測過程
leetcode #142 環狀鍊錶ii
快指標走的路程是慢指標的2倍
考慮快慢指標第一次相遇的情況(設此時慢指標走的路程為x) 指定乙個指標p放置在鍊錶頭部(p每次向前1個節點) 再走乙個路程為x的長度
慢指標到達了2x的位置指標p到達了x的位置慢指標和p相遇了
往前回放一下 在環的入口開始 慢指標和p已經相遇了
慢指標和p重疊走了一段距離
leetcode #202 快樂數
思路:轉化為判斷鍊錶是否有環的問題收斂性的證明
32位itht的表示正整數大概是21億( )
在這個範圍內 各位數字平方和最大的數是1999999999 和為730
根據鴿巢原理(pigeothhole』s prithciple,也譯作抽屜原理)在730次迴圈後必定出現重複
鍊錶的反轉
leetcode #206 反轉鍊錶思路1:迭代反轉
可以使用虛擬頭節點來進行頭插法
思路2:遞迴反轉(一次拆掉乙個節點並遞迴處理剩餘的子鍊錶)
leetcode #92 反轉鍊錶ii
技巧:使用虛擬頭結點(dummy head)
通常用於鍊錶的首位址有可能改變的情況
leetcode #25 k個一組翻轉鍊錶
思路:先判斷是否有k個元素 然後對這k個節點進行反轉 最後拆裝一下首尾部分
leetcode #61 旋轉鍊錶
思路:把整個鍊錶首尾相接 向後走k位後將環拆開
leetcode #24 兩兩交換鍊錶中的節點
思路與leetcode #25完全一致,是k = 2的簡單情形。
鍊錶的節點刪除
leetcode #19 刪除鍊錶的倒數第n個節點思路:找到前乙個節點 刪除後調整指標
leetcode #83 刪除排序鍊錶中的重複節點
leetcode #82 刪除排序鍊錶中的重複節點ii
求出答案後,使用答案的數值替換下面鏈結中的對應部分。
答案.mp4
經典鍊錶問題
題目描述 在單鏈表中輸出倒數第k個節點 要求 如果鍊錶長為n,時間複雜度為o n 額外空間複雜度達到o 1 思路 當我們用num來表示鍊錶中節點個數,當我們輸出節點的時候會出現三種情況 不存在第k個節點,此時返回空 num第k個節點就是第乙個節點,操作較容易 num k 第k個節點在鍊錶中 num ...
鍊錶經典問題彙總
原帖位址 收集了一下鍊錶常見的面試題 1 如何判斷乙個單鏈表有環 2 如何判斷乙個環的入口點在 3 如何知道環的長度 4 如何知道兩個單鏈表 無環 是否相交 5 如果兩個單鏈表 無環 相交,如何知道它們相交的第乙個節點是什麼 6 如何知道兩個單鏈表 有環 是否相交 7 如果兩個單鏈表 有環 相交,如...
鍊錶的經典問題
如果兩個單鏈表相交,那應該呈 y 字形,也就是從交點以後的部分是兩個鍊錶的公共節點。所以,判斷是否相交只要看兩個鍊錶的最後乙個節點是否為同乙個即可。那麼如何找到交點呢?設兩個單鏈表的長度分別為l1 l2,假設l1 l2 則 l1 l2 的值就是交匯之前兩個鍊錶的長度差 因此,只有讓更長的鍊錶先走l1...