链表中的迭代与递归

链表中的迭代与递归

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) 递归处理即可

posted @ 2021-06-08 15:14  niu_a  阅读(60)  评论(0编辑  收藏  举报