链表中的迭代与递归
链表中的迭代与递归
25. K 个一组翻转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(head==nullptr){
return head;
}
ListNode* a=head;
ListNode* b=head;
for(int i=0;i<k;i++){
if(b==nullptr){
return head;
}
b=b->next;
}
head=reverse(a,b);
a->next=reverseKGroup(b,k);
return head;
}
ListNode* reverse(ListNode* a,ListNode* b){//翻转[a,b) !!
ListNode* pre=nullptr;
ListNode* cur=a;
ListNode* nxt=cur;
while(cur!=b){
nxt=cur->next;
cur->next=pre;
pre=cur;
cur=nxt;
}
return pre;
}
};
把问题拆解,对于k个节点组成的链表,可用迭代的方法去翻转,
翻转完成后,剩下的链表缩短,问题规模减小且处理方法类似(出现重叠子问题Overlap subproblem) 递归处理即可