單鏈表的區塊反轉是經典的資料結構面試題目,也是實務開發中常見的操作。給定一個單鏈表與整數 k,目標是將鏈表每 k 個節點為一組進行反轉;若剩餘節點不足 k 個,則保持原序。
輸入:1→2→3→4→5→6→7→8→NULL,k = 3 輸出:3→2→1→6→5→4→7→8→NULL
上例中,前兩組各 3 個節點(1-2-3、4-5-6)被反轉,最後剩餘 2 個節點(7-8)不足 k,故維持原順序。
prev、curr、next 在區塊內進行原地反轉。count,當 count == k-1 時完成一組反轉。next 指向遞迴返回的新頭節點。k <= 1 直接返回原鏈表;節點不足 k 時回滾已反轉的部分。Node* invertList(Node *head, int k) {
if (k == 0 || k == 1) return head;
Node *prev = head;
Node *curr = prev->next;
Node *next = curr ? curr->next : NULL;
int count = 0;
while (count < k - 1) {
if (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
count++;
} else {
// 節點不足 k 個,回滾已反轉部分
curr = prev->next;
prev->next = NULL;
while (count > 0) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
count--;
}
return prev;
}
}
// 遞迴處理剩餘鏈表
if (next != NULL)
head->next = invertList(next, k);
else
head->next = NULL;
return prev; // prev 為反轉後的新頭節點
}
k=0 或 k=1 的邊界情況,直接返回原鏈表避免無限遞迴。