题目: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}