题目:K 个一组翻转链表
1ListNode* reverseKGroup(ListNode* head, int k)
2{
3 // 统计节点个数
4 int n = 0;
5 for(ListNode* node = head; node; node = node->next)
6 {
7 n++;
8 }
9
10 ListNode dummy(0, head);
11 ListNode* trailer = &dummy;
12 ListNode* curr = head;
13 ListNode* prev = nullptr;
14
15 //外层循环:确保每次只翻转 k 个节点
16 for(; k <= n; n -= k)
17 {
18 // 内层循环:执行翻转的操作
19 for(int i = 0; i < k; i++)
20 {
21 ListNode* temp = curr->next;
22 curr->next = prev;
23 prev = curr;
24 curr = temp;
25 }
26
27 // 将翻转后的节点组与其他节点进行连接
28 /* trailer->next 原本指向的是翻转链表的第一个节点
29 经过翻转之后,这个节点变成了最后一个节点 */
30 ListNode* nxt = trailer->next;
31 trailer->next = prev;
32 nxt->next = curr;
33 // 将 trailer 移动到下一组的前一个节点
34 trailer = nxt;
35 }
36 return dummy.next;
37}