快慢指標
奇數中點,偶數上中點
奇數中點,偶數下中點
奇數中點前乙個,偶數上中點前乙個
奇數中點前乙個,偶數下中點前乙個
遍歷壓棧法
右半部分壓棧法
右半部分改指標法
放入陣列,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 刪除乙個無頭單鏈表的非尾結點 ...