將鏈表向右旋轉 k 位。本文提供**成環→斷開**巧法:先連尾到頭成環,計算實際旋轉步數,找到新尾節點斷開,返回新頭。單次遍歷獲取長度與尾節點,邏輯極簡、無邊界分支。
將鏈表尾接到頭形成環,旋轉 k 步相當於**新頭節點是原鏈表第 (n - k%n) 個節點**,新尾是其前驅。只需:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k) {
if (!head || !head->next || k == 0) return head; // 空/單節點/無需旋轉
// 1. 遍歷計算長度 n,獲取尾節點 tail
struct ListNode *tail = head;
int n = 1;
while (tail->next) {
tail = tail->next;
n++;
}
// 2. 成環
tail->next = head;
// 3. 計算實際旋轉步數(新頭距原頭步數)
k = n - (k % n); // k 在 [1, n] 範圍內
// 4. 找到新尾節點(走 k-1 步)
struct ListNode *new_tail = head;
for (int i = 1; i < k; i++) {
new_tail = new_tail->next;
}
// 5. 斷開環,返回新頭
struct ListNode *new_head = new_tail->next;
new_tail->next = NULL;
return new_head;
}
| 輸入 | k | 輸出 | 說明 |
|---|---|---|---|
| 1→2→3→4→5 | 2 | 4→5→1→2→3 | 標準 |
| 0→1→2 | 4 | 2→0→1 | k > n (4%3=1, 相當於右旋1) |
| 1→2 | 0 | 1→2 | k=0 |
| 1 | 99 | 1 | 單節點 |
| NULL | 5 | NULL | 空鏈表 |
旋轉鏈表通過**成環斷開**化繁為簡,單次遍歷、無分支邊界、邏輯閉環自洽。此技巧同樣適用於「鏈表左旋」、「找倒數第 k 個節點」等問題。掌握「尾接頭成環、取模消圈、斷開重組」三步曲,是鏈表操作進階必備技能。