劍指offer題目系列三(鍊錶相關題目)

2022-09-17 19:36:13 字數 2490 閱讀 9484

9、o(1)時間內刪除鍊錶結點

題目:在o(1)時間內刪除鍊錶結點。給定單鏈表的頭指標和乙個結點指標,定義乙個方法在o(1)時間內刪除該結點。

單鏈表的定義如下:

解答:單向鍊錶刪除乙個結點,最直觀的想法是從鍊錶的頭結點開始順序遍歷查詢要刪除的結點,然後刪除該結點,這種做法的時間複雜度為o(n),顯然不滿足本題要求。如果我們把下乙個結點的資訊複製到要刪除的結點上,覆蓋原有內容,再把下乙個結點刪除,這樣就相當於把該結點刪除了,本題解法基於這種方式。

首先把要刪除的結點(i)的下乙個結點(j)的資訊複製到結點i,然後把i指向它的下下個結點(即j的下乙個結點),然後再把結點j刪除,這樣就把i刪除了。有兩個特殊情況:如果要刪除的結點i所在的鍊錶中只有乙個結點,那麼將其置空(null)即可;如果要刪除的結點i是鍊錶尾部的最後乙個結點,這就需要從鍊錶的頭結點開始,順序遍歷鍊錶到該結點,然後將其置空(null),完成刪除。

可以看到,刪除頭結點和中間結點的時間複雜度為o(1),而刪除尾結點的時間複雜度為o(n),但總的平均時間複雜度還是o(1),符合要求。

10、鍊錶中倒數第k個結點

題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。按大多數人的習慣,設煉表的尾結點為倒數第乙個結點。

單鏈表的定義如下:

解答:本題採用快慢指標的思想,可以定義兩個指標。第乙個指標從鍊錶的頭結點開始遍歷k-1個結點,第二個指標保持不動;當第乙個結點遍歷到第k個結點時,第二個結點從鍊錶的頭結點開始遍歷,兩個指標的距離始終保持k-1。當第乙個指標遍歷到鍊錶的尾結點時,此時第二個指標所在的位置正是倒數第k個結點的位置。需要注意的是鍊錶不能為空(null),同時k不能大於鍊錶長度。

11、反轉鍊錶

題目:定義乙個方法,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。

單鏈表的定義如下:

解答:本題需要知道三個結點,即當前結點(node)、當前結點的前乙個結點(prenode)、當前結點的下乙個結點(nextnode)。

反轉時,將當前結點(node)的下乙個結點指向其前乙個結點(prenode),這樣當前結點(node)與其原來的下乙個結點(nextnode)之間發生了斷裂,所以需要儲存其原來的下乙個結點(nextnode)資訊。然後將當前結點賦值給前乙個結點(prenode),下乙個結點賦值給當前結點……以此類推,直到下乙個結點為空,此時當前結點就是反轉後鍊錶的頭結點。

12、合併兩個排序的鍊錶

題目:輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是遞增排序的。

例如:輸入鍊錶1:1->3->5->7

鍊錶2:2->4->6->8

返回鍊錶:1->2->3->4->5->6->7->8

單鏈表的定義如下:

解答:本題採用遞迴方法,利用歸併的思想。

首先定義乙個新鍊錶(newlist),存放合併後的資料。然後分別遍歷兩個鍊錶(list1和list2)的頭結點,比較其大小。如果list1的頭結點小於等於list2的頭結點,則將list1的頭結點新增到新鍊錶中(newlist),然後將list1頭結點的下乙個結點與list2的頭結點作為引數,執行本方法(即遞迴);反過來如果list1的頭結點大於list2的頭結點,則將list2的頭結點新增到新鍊錶中(newlist),然後將list1的頭結點與list2頭結點的下乙個結點作為引數,執行本方法(即遞迴)……以此類推,不斷遞迴,直到list1或list2為空,然後將另乙個列表剩餘結點直接放到新煉表中即可。

例如題目中兩個鍊錶第一次比較時,list1的頭結點1小於list2的頭結點2,故list1頭結點1放入newlist中;然後list1頭結點的下乙個結點3大於list2的頭結點2,故list2頭結點2放入newlist中;然後list1頭結點的下乙個結點3小於list2頭結點的下乙個結點4,故list1頭結點的下乙個結點3放入newlist中……

劍指offer 鍊錶相關

劍指offer面試常考手擼演算法題 鍊錶篇 1.從頭到尾列印鍊錶 1 class solution 8 vectorres 9 stacks 10while head nullptr 1115 while s.empty 1620 return res 21 22 可以直接插入vector中,翻轉v...

劍指offer 鍊錶相關問題總結

首先統一鍊錶的資料結構為 struct listnode 題目一 從尾到頭列印鍊錶 輸入乙個鍊錶。從尾到頭列印鍊錶每乙個節點的值。分析 難點在於鍊錶僅僅有指向後繼的指標,沒有指向前驅的指標。轉換思路。結合棧後進先出的特點,能夠遍歷鍊錶,依次將資料元素存入棧中,然後再依次出棧,即為從尾到頭的順序。ve...

《劍指offer 之鍊錶題目

這幾天在看 劍指offer 寫的很好,跟july的各有千秋,更加注重歸納總結,筆試面試臨時抱佛腳,決定要啃下這其中的46道題目。ok,把每道題目自己實現,相同的歸成一類。這次把所有的與list相關的題目列出來。思路 從尾到頭列印list的話,考慮用stack先把各節點儲存起來,遍歷完以後再將stac...