這篇文章是關於鏈表的專題文章,總結的是劍指offer中的鏈表的相關知識。有關鏈表的具體知識可以看這篇文章。
引用維基百科中的話:鏈表(Linked list)是一種常見的基礎數據結構,是一種線性表,但是並不會按線性的順序存儲數據,而是在每一個節點裏存到下一個節點的指針(Pointer)。由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的複雜度,比另一種線性表順序表(數組)快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而順序表相應的時間複雜度分別是O(logn)和O(1)。
鏈表作爲一種基礎的數據結構可以用來生成其它類型的數據結構如堆棧或隊列。鏈表通常由一連串節點組成,每個節點包含任意的實例數據(data fields)和一或兩個用來指向上一個/或下一個節點的位置的鏈接("links")。如下圖所示,以單向鏈表爲例。
下面開始劍指offer中的題目。
1. 劍指offer第6題:從尾到頭打印鏈表
這道題的題目描述和代碼實現見下圖:
這是一道很簡單的鏈表相關的題目,不再贅述。
2. 劍指offer第18題:刪除鏈表的節點
這道題的題目描述和代碼實現見下圖:
這道題同時衍生了其變形題目:刪除鏈表中的重複節點。不再進行贅述。
3. 劍指offer第22題:鏈表中倒數第k個節點
這道題的題目描述和代碼實現見下圖:
其中第一道題目的第二種解法的圖解如下:
4. 劍指offer第23題:鏈表中環的入口節點
這道題的題目描述和代碼實現見下圖:
尋找環的入口節點的圖解如下:
5. 劍指offer第24題:反轉鏈表
這道題的題目描述和代碼實現見下圖:
反轉鏈表的圖解如下:
6. 劍指offer第25題:合併兩個排序的鏈表
這道題的題目描述和代碼實現見下圖:
合併鏈表的示意圖如下:
7. 劍指offer第35題:複雜鏈表的複製
這道題的題目描述和代碼實現見下圖:
這道題目的圖解過程如下:
8. 劍指offer第36題:二叉搜索樹與雙向鏈表
這道題的題目描述和代碼實現見下圖:
假設將下圖的二叉搜索樹轉換爲雙向鏈表:
此過程的圖解如下:
9. 劍指offer第52題:兩個鏈表的第一個公共節點
這道題的題目描述和代碼實現見下圖:
測試函數中創建的鏈表如下: