/**
* 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类
*/
ListNode* reverseONE(ListNode* headone, int k){ //反转链表,增加处理头尾节点的部分
ListNode* curr = headone->next;
ListNode* prev = nullptr;
ListNode* tail = headone->next; //记录这组新的尾
while(k--){
ListNode* temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
tail->next = curr; //把新的尾连接到下一组的头;
headone->next = prev; //把上一组的尾连接到这组的头;
return headone = tail;
}
ListNode* reverseKGroup(ListNode* head, int k) { //主函数
ListNode* node = head;
int nums = 0;
while(node){ //统计有多少个节点
++nums;
node = node->next;
}
int groupnums = nums/k; //计算多少组
ListNode dummy(0); //头结点处理
dummy.next = head;
node = &dummy;
for(int i=1; i <=groupnums; i++){ //每组处理
node = reverseONE(node, k); //返回时更新下一组的头
}
return dummy.next;
}
};