leetcode-25 K 个一组翻转链表

本文详细介绍了如何通过分块反转的方法来处理链表问题,包括两个核心函数`reverseGroup`和`reverseKGroup`,分别用于反转指定大小的链表块。算法的时间复杂度为O(n),空间复杂度为O(1)。通过实例展示了如何在链表中反转连续的k个节点,对于k小于等于1或者空链表的情况也进行了处理。
摘要由CSDN通过智能技术生成

力扣

思路:分块转换,最后一块不转换

//多维矩阵反转
ListNode* reverseGroup(ListNode* head, int k) {
    ListNode *res = new ListNode();
    ListNode *resHead;
    resHead = res;
    int i = 1;
    while(head) {
        ListNode *temp = res->next;
        ListNode *temp2 = head->next;
        res->next = head;
        head->next = temp;
        head = temp2;
        if (i % k == 0) {
            while(res->next) {
                res = res->next;
            }
        }
        i += 1;
    }
    return resHead->next;
}

ListNode* reverseKGroup(ListNode* head, int k) {
    if (k <= 1 || head == NULL) {
        return head;
    }

    ListNode *res = new ListNode();
    ListNode *resHead;
    resHead = res;
    ListNode *kgroup = new ListNode();
    ListNode *khead = kgroup;
    int i = 1;
    while(head) {
        ListNode *temp2 = head->next;
        kgroup->next = head;
        head->next = NULL;
        kgroup = kgroup->next;
        head = temp2;

        if (i % k == 0) {
            ListNode *temp = reverseGroup(khead->next, k);
            res->next = temp;
            res = res->next;
            while(res->next) {
                res = res->next;
            }
            kgroup = new ListNode();
            khead = kgroup;
        }
        i += 1;
    }
    res->next = khead->next;
    return resHead->next;
}
o(n), o(1)算法

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* reverse(ListNode* head, ListNode* tail) {
        ListNode* res;
        ListNode* root = new ListNode(0);
        res = root;
        while (head != tail) {
            ListNode* temp = head->next;
            head->next = root->next;
            root->next = head;
            
            head = temp;
        }
        return res->next;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* root;
        ListNode* merge = new ListNode(0);
        root = merge;
        ListNode* tempHead = head;
        for (int i = 0; i < k; i++) {
            if (head) {
                head = head->next;
            } else {
                return tempHead;
            }
        }
        ListNode* newHed = reverse(tempHead, head);
        tempHead->next = reverseKGroup(head, k);
        //return newHed;
        return newHed;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值