給定單鏈表頭節點 head 和非負整數 k,將鏈表向右旋轉 k 位。即最後 k 個節點移至頭部。
範例:1→2→3→4→5→NULL, k=2 → 4→5→1→2→3→NULL
len,同時找到尾節點 tailk %= len 處理 k ≥ len 情況(循環旋轉等價)k == 0 直接返回原頭len - k 個節點(0-indexed 為 len - k - 1)newTail->next,斷開連接,tail->next = head
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head || !head->next || k == 0) return head;
// 1. 計算長度,找到尾節點
int len = 1;
ListNode* tail = head;
while (tail->next) {
++len;
tail = tail->next;
}
// 2. 處理 k >= len
k %= len;
if (k == 0) return head;
// 3. 找到新尾節點 (第 len-k 個)
ListNode* newTail = head;
for (int i = 1; i < len - k; ++i) {
newTail = newTail->next;
}
// 4. 重新連接
ListNode* newHead = newTail->next;
newTail->next = nullptr;
tail->next = head;
return newHead;
}
};
1→2→3→4→5, k=2
len=5, tail=5 k=2%5=2 newTail 移動 len-k-1 = 2 步:1→2→3 (指向 3) newHead = 4 斷開 3→4,連接 5→1 結果:4→5→1→2→3
k %= len 必不可少,避免多餘旋轉k=0、k=len 皆返回原頭tail->next = head 先成環,再移動 len-k 步斷開LeetCode 61 是鏈表基本操作題。核心步驟:測長、取模、找新尾、重連。注意 k %= len 處理大 k,以及空表/單節點邊界。代碼簡潔,考察指針操作熟練度。