随笔 - 112  文章 - 0  评论 - 0  阅读 - 1384

K 个一组翻转链表(逆置链表+递归)

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

 

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]


复制代码
class Solution {
public:
    // 反转以head为头结点的链表中的前k个节点
    ListNode* reverse(ListNode *head, int k){
        // 创建一个新的节点作为反转后的头部(哨兵节点)
        ListNode *pre = new ListNode();
        pre->next = nullptr;
        // p指针用于遍历需要反转的链表部分
        ListNode *p = head;
        // 进行k次反转操作
        while(k--){
            // q指针保存下一个要处理的节点
            ListNode *q = p->next;
            // 将当前节点p的next指向pre的next,完成一次反转
            p->next = pre->next;
            // 更新pre的next为当前节点p
            pre->next = p;
            // 移动p指针到下一个节点q,准备下一次反转
            p = q;
        }
        // 返回反转后的链表头部
        return pre->next;
    }

    // 主函数:反转链表中每k个节点
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head == nullptr) return head;  // 如果链表为空,直接返回
        // 检查是否有至少k个节点可以反转
        ListNode *end = head;
        for(int i = 0; i < k; i++){
            // 如果在检查过程中发现节点不足k个,直接返回原链表不做任何改变
            if(end == nullptr) return head;
            end = end->next;
        }
        // 对前k个节点进行反转,获取新的头结点
        ListNode *newHead = reverse(head, k);
        // 将已反转部分与后续未处理部分连接起来
        head->next = reverseKGroup(end, k);
        // 返回新的头结点
        return newHead;
    }
};
复制代码

 

posted on   _月生  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示