/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ /* 核心思想是 每k个元素看作是一个子链表,做该子链表的逆序,一共做 len/k次 逆序的做法是 在头节点后面不断插入新遍历的节点 */ ListNode* reverseKGroup(ListNode* head, int k) { // write code here ListNode* p = head; int cnt = 0; struct ListNode* h = (struct ListNode*)malloc(sizeof(struct ListNode*)); int len = 0; //链表长度 ListNode* q = head; while(q){ len++, q= q->next; } // 记录每次 链表倒置时的最后一个位置 ListNode* last = nullptr; // 记录每次 链表倒置 ListNode* lastn = nullptr; int times = 0; int m = len / k; while (p) { printf("p=%d\n", p->val); ListNode* n = p->next; if (times == 0) { if (cnt == 0) { last = p; p->next = nullptr; } else { p->next = h->next; } h->next = p; cnt++; if (cnt == k) { cnt = 0; times ++; } }else{ if (cnt == 0) { lastn = p; p->next = nullptr; } else { p->next = last->next; } last->next = p; cnt++; if (cnt == k){ cnt = 0, times++; last = lastn; } } p = n; if(times==m){ last->next = p; break; } } return h->next; } };