給定單鏈表頭節點和整數 k,將鏈表向右旋轉 k 位。例如 1→2→3→4→5, k=2 → 4→5→1→2→3。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head) return nullptr;
// 1. 成環並計算長度
ListNode* tail = head;
int len = 1;
while (tail->next) {
tail = tail->next;
++len;
}
tail->next = head; // 形成環
// 2. 找新尾節點
int steps = len - k % len;
ListNode* newTail = tail;
for (int i = 0; i < steps; ++i)
newTail = newTail->next;
// 3. 斷開環
ListNode* newHead = newTail->next;
newTail->next = nullptr;
return newHead;
}
};
原始:1 → 2 → 3 → 4 → 5 (len=5, k=2)
成環:1 → 2 → 3 → 4 → 5 ↘
↑_______________|
steps = 5 - 2%5 = 3
從 tail(5) 走 3 步:5→1→2→3 (newTail=3)
斷開:newHead=4, 3->next=null
結果:4 → 5 → 1 → 2 → 3