莫比乌斯反演 2021-12-18 08:28 采纳率: 100%
浏览 18
已结题

K 个一组翻转链表,每 k 个节点一组进行翻转,请你返回翻转后的链表

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

  • 写回答

1条回答 默认 最新

  • 英雄哪里出来 2021年博客之星Top1 2021-12-18 08:30
    关注

    一、分析

    分几步吧,首先实现一个链表反转的接口,然后实现一个每k个结点截断的接口。
    一段一段的就进行反转,反转利用递归实现。

    二、源码

    struct ListNode* reverseList(struct ListNode *l) {
        struct ListNode *pre = l, *now = l->next;
        struct ListNode *head = l;
        while(now) {
            pre->next = now->next;       // (1) 将 now 从链表中剥离出来;
            now->next = head;            // (2) 将 now 插入到之前的链表头之前;
            head = now;                  // (3) 让 now 成为新的链表头;
            
            now = pre->next;             // (4) now 也前进一格;
        }
        return head;
    }
    
    // 返回第 k 个 node,不存在这返回 NULL;
    struct ListNode* KLastNode(struct ListNode *l, int k) {
        int cnt = 0;
        while (l) {
            ++cnt;
            if(cnt >= k) {
                return l;
            }
            l = l->next;
        }
        return NULL;
    }
    
    struct ListNode* reverseKGroup(struct ListNode* head, int k){
        struct ListNode *node = KLastNode(head, k);
        struct ListNode *tmp, *last;
        if(!node) {
            return head;
        }
        tmp = reverseKGroup(node->next, k);
        node->next = NULL;
        last = head;
        head = reverseList(head);
        last->next = tmp;
        return head;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月18日
  • 已采纳回答 12月18日
  • 创建了问题 12月18日

悬赏问题

  • ¥50 求解vmware的网络模式问题
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?