常見鏈表面試題解題思路

2021-10-06 23:07:36 字數 1233 閱讀 9173

快慢指標

奇數中點,偶數上中點

奇數中點,偶數下中點

奇數中點前乙個,偶數上中點前乙個

奇數中點前乙個,偶數下中點前乙個

遍歷壓棧法

右半部分壓棧法

右半部分改指標法

放入陣列,partition

鍊錶法

// 提供特殊的節點

class

node

}

map

key 是 node,value 是 node*

map.get(node).next == map.get(node.next)

map.get(node).rand == map.get(node.rand)

構建對映關係

node1.next = node*,node1*.next = node2 … (原來兩個node節點中插入乙個複製節點)

當 node1.rand 指向不為空時,node1*.rand = node1.rand.next

將複製節點分離

三種情況

兩個無環相交

乙個無環乙個有環,不可能相交

兩個有環相交

單鏈表入環不可能出來

如圖1:快指標走兩步,慢指標走一步,總會快慢指標相遇

如圖2:相遇後,快指標回到頭結點,改為一次走一步,第二次相遇時的節點即為頭結點

倆鍊錶最後的節點是同乙個節點

node1 和 node2 一直next,直到節點下乙個節點為null時停止

倆節點指向不同位址說明一定沒相交

長鍊錶走乙個差值的 next 次數

長短鍊錶同時next,直到倆節點相等時,說明是第乙個相交節點

入環節點相同,在入環處相交:loop1 == loop2,改無環**,遇到 loop 停

入環節點不同,在入環前相交:loop1 != loop2,改倆無環鏈表相交**

常見單鏈表面試題

面試中經常被問到有關鍊錶的問題,現總結如下 此處的鍊錶結構為不帶頭結點的單鏈表 單鏈表結構 struct listnode 1 尾插法建立單鏈表 listnode buildlisttail int n else return head 輸入1 2 3 4,輸出1 2 3 42 頭插法建立單鏈表 l...

鏈表面試題

不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...

鏈表面試題

從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...