25. K 个一组翻转链表

25. K 个一组翻转链表

题目

K 个一组翻转链表题目
变式:不足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:
    // 对k个结点进行反转,并将下一组k个结点的头节点放在nextHead中
    ListNode* f(ListNode* head, ListNode*& nextHead, int k) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while (k--) {
            ListNode* post = cur->next;
            cur->next = pre;
            pre = cur;
            cur = post;
        }
        nextHead = cur;
        return pre;
    }

    ListNode* reverseKGroup(ListNode* head, int k) {
        // 使用sz记录链表的长度
        int sz = 0;
        ListNode* p = head;
        while (p) {
            p = p->next;
            sz++;
        }

        // 创建一个虚拟头节点
        ListNode* newHead = new ListNode(0);
        p = newHead;
        ListNode* q = head;
        // 将链表中满足k个节点的子链表反转
        for (int i = 0; i < sz / k; i++) {
            // tail记录反转k个结点后的尾结点
            ListNode* tail = q;
            // nextNode记录下一个k个节点的头节点
            ListNode* nextNode = nullptr;
            // f返回反转后的头节点
            p->next = f(q, nextNode, k);
            // p更新为尾结点
            p = tail;
            p->next = nullptr;
            // q更新为下一组k个节点的头节点
            q = nextNode;
        }
        // 在将不足k个结点的链表直接连接
        p->next = q;

        // // 如果题目为不足k个也反转
        // ListNode* pre = nullptr;
        // ListNode* cur = q;
        // while (cur) {
        //     ListNode* post = cur->next;
        //     cur->next = pre;
        //     pre = cur;
        //     cur = post;
        // }
        // p->next = pre;

        ListNode* ans = newHead->next;
        delete newHead;
        return ans;
    }
};

官方题解:K 个一组翻转链表题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值