題目連結:
題目意譯:
給定一個連結串列(Linked List),一次反轉 k 個連結串列之節點並回傳修改後的列表。
k 為一正整數且小於等於連結串列之長度。如果節點數不是 k 的倍數,則結尾的剩餘節點們應保持原樣。
你不得修改列表中的節點值,只有節點本身可以更動位置。
限制:
列表中的節點數為 sz。
1 ≦ sz ≦ 5000
0 ≦ Node.val ≦ 1000
1 ≦ k ≦ sz
進階: 你可以利用 O(1) 額外空間解出這道問題嗎?
範例測資:
範例 1:
輸入: head = [1,2,3,4,5], k = 2
輸出: [2,1,4,3,5]
範例 2:
輸入: head = [1,2,3,4,5], k = 3
輸出: [3,2,1,4,5]
範例 3:
輸入: head = [1,2,3,4,5], k = 1
輸出: [1,2,3,4,5]
範例 4:
輸入: head = [1], k = 1
輸出: [1]
解題思維:
在最前面加一個 dummy 指向 head(方便用)。然後從 head 往尾端跑,並將「每個」節點指向其前一個節點。
每 k 個節點為一個群組。每當我們遇到一個群組的結尾節點(因為我們是邊往尾端跑邊反轉,所以實際上現在是一個群組的「開頭」)時,便前一個群組之結尾(dummy 視為「第零個群組之結尾」)指向該節點。
最後判斷最後一個群組是否不足 k 個。如果不夠則代表剛剛的反轉操作是白做的,因此需要將其反轉回去。
最後 dummy->next 即為所求修改後的列表之開頭節點。這樣便只需 O(1) 額外空間以及 O(n) 的時間即可完成本題。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。