首先需要一个反转链表的子函数,能够反转[left,right)并且返回反转之后的头结点。在以每k个节点反转链表的函数中,采用递归调用,每次都用head->next来接住递归返回的反转后的头结点。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverse_list(ListNode* left,ListNode* right){
if(left==right) return left;
ListNode* pre=nullptr;
ListNode* cur=left;
while(cur!=right){
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if(head==nullptr) return head;
ListNode* right=head;
int cont=k;
while(cont--){
if(right==nullptr) return head;
right=right->next;
}
ListNode* temp_head=reverse_list(head,right);
head->next=reverseKGroup(right, k);
return temp_head;
}
};