Skip to content

Commit 5bcfb3a

Browse files
Alan TsengAlan Tseng
authored andcommitted
add reverse k, merge sort
1 parent d5b2bc2 commit 5bcfb3a

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed

docs/BMC/openbmc.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[The overview and future of Open Source FW for server industry](https://youtu.be/cnC4zmxm5AY?si=c0G3e_4zOFUZe7g2)

docs/DSA/Linked_List/0.linked_list.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
![alt text](assets/image-13.png)
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
```
298381
gcc -Wall -o linked_list.out main.c list.c
273 KB
Loading
99.6 KB
Loading

docs/career.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
3+
https://hackmd.io/@sysprog/info2024/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FH1-4KbanC

docs/git.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
- `git diff`
3+
- `-stats`: show stats of changes
4+
- `--cached`: show staged changes
5+
6+
7+
- `git reset ~head~1`
8+
9+
- `git commit`
10+
`-s`: sign off on the commit
11+
`-m`: commit message
12+
`--amend`: amend the last commit
13+

0 commit comments

Comments
 (0)