反轉鏈結串列 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!
評論










