本题要求反转k个一组的链表。使用递归函数可以简化思路,首先划分子问题,子问题是K个相同的部分。对于一个部分【a,b)反转函数很简单。剩下的我们应该同样调用反转函数,我们不必关心这个递归内部的压栈是什么样的,只需要关心这个函数就是用来反转的。因此a.next=reverserGroup(b.next,k);链接起来即可。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
if(head==NULL)return NULL;//递归的出口
ListNode* a=head;
ListNode* b=head;
for(int i=0;i<k;i++){//找到b的位置
if(b==NULL)return head;
b=b->next;
}
ListNode* res=reverseN(a, b);//反转【a,b)区间段
a->next=reverseKGroup(b, k);//调用递归
return res;
}
ListNode * reverseN(ListNode* a,ListNode* b){//辅助函数反转[a,b)区间段的元素
ListNode *pre,*cur,*nex;
cur=nex=a;
while(cur!=b){
nex=cur->next;
cur->next=pre;
pre=cur;
cur=nex;
}
return pre;
}
};