反轉鏈結串列 II | Medium | LeetCode#92. Reverse Linked List II
題目敘述
- 題目難度:
Medium
- 題目描述:給定一個鏈結串列的
head
以及整數left
和right
,其中left<= right
,請將left
到right
範圍內的鏈結進行反轉,最後回傳整個串列的頭。
解法
一開始的想法
一開始的想法蠻單純的,就是要找到 left
的前一個節點,以及 right
的後一個節點 (用來記錄反轉後要連接的節點),將中間鏈結反轉後再接回這兩個節點。
我的解法
1 | /** |
後來發現也不用找到 right
後面的節點,找到 left
後就可以開始反轉了。這裏反轉的操作就是典型做法,透過一個 temp
指標紀錄當前節點的下一個位址,接著將當前節點接到前一個節點上,最後更新當前節點指標 ptr
和先前節點指標 prev
,一旦反轉到 right
節點,則停止。 最後需要將反轉後的串列跟原本的節點合併。
反轉前
1 | dummy -> ... -> leftNode -> [待反轉區域] -> ptr -> ... |
反轉後
1 | dummy -> ... -> leftNode -> [反轉後的區域頭節點 prev] -> ... -> [反轉後的區域尾節點] -> ptr -> ... |
反轉後的 ptr
會是反轉後串列右側需要接上的節點,但因為串列被反轉了,因此目前最右側的節點會是 leftNode->next
因此需要將他的下一個節點指向 ptr
(leftNode->next->next = ptr
) 接著需要將反轉前的左節點連接到反轉後的子串列的尾端節點 (leftNode->next
)。
函數最後回傳 dummyNode->next
則會是新串列的頭。
執行結果
複雜度
時間複雜度: $O(n)$
空間複雜度: $O(1)$
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Kevin Liu's 部落格 || Technical || Travel!
評論