給定單鏈表頭節點,將鏈表向右循環移動 k 位。如 1→2→3→4→5, k=2 → 4→5→1→2→3。k 可能大於鏈表長度。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head) return head;
int len = 1;
ListNode* tail = head;
while (tail->next) { tail = tail->next; ++len; }
k %= len;
if (k == 0) return head;
ListNode* prev = head;
for (int i = 0; i < len - k - 1; ++i) prev = prev->next;
ListNode* newHead = prev->next;
prev->next = nullptr;
tail->next = head;
return newHead;
}
};
鏈表循環右移本質是斷開重連,關鍵在於找到斷開點。先成環再斷開也是常見技巧(tail->next = head,然後移動 n-k 步斷開)。