栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode25 K个一组反转链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode25 K个一组反转链表

LeetCode25 K个一组反转链表

  1. 代码实现

    class Solution {
        public ListNode reverseKGroup(ListNode head, int k) {
            if (head == null) return null;
            ListNode a, b;
            a = b = head;
            for (int i = 0; i < k; i++) {
                if (b == null) {
                    return head;
                }
                b = b.next;
            }
    
            ListNode newHead = reverse(a,b);
            a.next = reverseKGroup(b, k);
            return newHead;
        }
    
        ListNode reverse(ListNode head, ListNode b) {
            ListNode cur = head;
            ListNode pre = null;
            ListNode temp = null;
            while (cur != b) {
                temp = cur.next;
                cur.next = pre;
                pre = cur;
                cur = temp;
            }
            return pre;
        }
    }
    
  2. 思路分析

    1. 分析问题: 我们如果对这个链表进行reverseKGroup(head, 2),即以2个节点为一组进行反转;当我们完成反转后,发现该链表中剩余的未反转节点也是一条链表,而且规模比之前的链表小了,这就是子问题

    2. 对于子问题可以采用递归:我们可以在反转完一次后,将head节点移动到子链表的开头,再进行反转,一次往复,直到反转完成——剩余的子链表节点个数小于k,这也就是base case

    3. 算法流程

      1. 先反转以head开头的k个元素,再让head指向第k+1个节点

      2. 递归调用reverseKGroup(head, 2)

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWSa1GTE-1652965914056)(https://s2.loli.net/2022/05/19/FluOCqBprfg3WZ7.png)]

  3. 代码分析

    1. reverse()为双指针反转链表,可看前文
    2. reverseKGroup()执行流程
      1. 执行过程即为上述递归调用
      2. 执行结果
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917255.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号