LeetCode 25 - Reverse Nodes in k Group
題目
題目連結:https://leetcode.com/problems/reverse-nodes-in-k-group/
給定一個 Linked List(以下簡稱串列),以每 k 個節點為一段做反轉。
保證 k > 0 且 k <= 串列長度,如果剩下的一段長度不足 k 則不需要反轉。
範例說明
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
想法
把題目拆成兩個遞迴式來想。
首先,如果只要將串列 head 的前 k 個節點做反轉,
例如:k = 3: 1->2->3->... -> 3->2->1->...
可以發現除了第一個節點外,每一個節點都要連向上一個節點。所以遞迴函數中,紀錄 當前節點 head, 上一個節點 lastNode,剩餘數量 k,如下:
reverseSingleGroup(head, lastNode, k)
每次都將 head->next 連向 lastNode,並且遞迴向下 reverseSingleGroup(head->next, head, k - 1),要注意在修改 head->next 之前要先把 head->next 記錄下來。
當做到 k = 1 時,代表當前 head 等於反轉串列後的新的 head,所以我們一路將 head 返回。
再來,每 k 個節點為一段做反轉,我們定義遞迴函數 reverseKGroup(head, k),
可以發現 reverseKGroup(head, k) = reverseSingleGroup(head, reverseKGroup({ the k + 1 Node }, k), k),
也就是 reverseKGroup(head, k) 等於將前 k 個節點反轉(reverseSingleGroup(head, ..., k)),且從第 k + 1 個節點繼續做每 k 個節點為一點反轉,(reverseKGroup({ the k + 1 Node}, k))。
還有一點要注意,在 reverseSingleGroup(head, lastNode, k) 中有提到,每次都應該要將 head->next = lastNode,但第一次呼叫的 lastNode 上面並沒有特別說明。因為第一次呼叫的 lastNode 應該要等於 reverseKGroup({ the k + 1 Node }, k) 所返回的新的 head。例如:
1->2->3->4->5->6, k = 3,呼叫 reverseSingleGroup(1, reverseKGroup(4, 3), 3),且 reverseKGroup(4, 3) = reverseSingleGroup(4, nullptr, 3) = 6->5->4,所以:reverseSingleGroup(1, 6->5->4, 3),所以節點 1 應該要連向節點 6。即:3->2->1->6->5->4。
最後,若 reverseKGroup 時長度已經不足 k,則直接返回串列。
程式碼
1  | /**  |