@@ -293,6 +293,89 @@ void reverse(Node *head)
293293 head->next = prev;
294294}
295295```
296+
297+ ### 實作反轉 K 個節點
298+ ![ alt text] ( assets/image-12.png )
299+ ``` c
300+ /* 以 dummy 為鏈首,將串列每 k 個節點反轉 */
301+ void reverseK (Node * dummy, int k) {
302+ puts("reverseK");
303+ if (k <= 1 || !dummy || !dummy->next) return;
304+
305+ Node *group_prev = dummy; /* 目前這組前一個節點(首輪為 dummy) */
306+
307+ while (1) {
308+ /* 1️⃣ 找到這組第 k 個節點 (kth) */
309+ Node *kth = group_prev;
310+ for (int i = 0; i < k && kth; ++i)
311+ kth = kth->next;
312+ if (!kth) break; /* 剩餘不足 k 個,不反轉 */
313+
314+ Node *group_next = kth->next; /* 下一組開頭 */
315+ /* 2️⃣ 就地反轉 [group_prev->next, kth] 之間的指標 */
316+ Node *prev = group_next;
317+ Node *curr = group_prev->next;
318+ while (curr != group_next) {
319+ Node *tmp = curr->next;
320+ curr->next = prev;
321+ prev = curr;
322+ curr = tmp;
323+ }
324+ /* 3️⃣ 接回前後串列 */
325+ Node *old_group_head = group_prev->next;
326+ group_prev->next = kth;
327+ group_prev = old_group_head; /* 為下一輪準備:此時它是反轉後的尾 */
328+ }
329+ }
330+ ```
331+ ### 實作 merge sort linked list
332+ 
333+ ```c
334+ // Merge two sorted lists using comparator
335+ Node* merge(Node *a, Node *b, int (*cmp)(int, int)) {
336+ Node dummy;
337+ Node *tail = &dummy;
338+ dummy.next = NULL;
339+ while (a && b) {
340+ if (cmp(a->data, b->data) <= 0) {
341+ tail->next = a; // 接上較小的節點
342+ a = a->next;
343+ } else {
344+ tail->next = b;
345+ b = b->next;
346+ }
347+ tail = tail->next;
348+ }
349+ tail->next = a ? a : b; // 接上剩餘的節點
350+ return dummy.next;
351+ }
352+
353+ // Helper: merge sort for linked list with comparator
354+ static Node* merge_sort_internal(Node* head, int (*cmp)(int, int)) {
355+ if (!head || !head->next) return head;
356+ Node *slow = head, *fast = head->next;
357+ while (fast && fast->next) {
358+ slow = slow->next;
359+ fast = fast->next->next;
360+ }
361+ Node *mid = slow->next;
362+ slow->next = NULL;
363+ Node *left = merge_sort_internal(head, cmp);
364+ Node *right = merge_sort_internal(mid, cmp);
365+ return merge(left, right, cmp);
366+ }
367+
368+ // Sort using merge sort with comparator function
369+ void sort(Node *node, int (*cmp)(int, int)) {
370+ node->next = merge_sort_internal(node->next, cmp);
371+ }
372+ // Convenience: ascending order comparator
373+ int cmp_asc(int a, int b) { return a - b; }
374+ // Convenience: descending order comparator
375+ int cmp_desc(int a, int b) { return b - a; }
376+ ```
377+
378+
296379## 編譯
297380```
298381gcc -Wall -o linked_list.out main.c list.c
0 commit comments