当前位置: 首页 > article >正文

LeetCode 25. K 个一组翻转链表

题目描述


分析

与两两交换是对应的题目。依然是从dummy结点开始,首先要判断之后是否还有K个结点。如果不足,结束翻转。这里要分为三个部分进行处理,包含:K个结点的翻转、左边指向改变、右边被指向改变。
K个结点的翻转:相当于是改K-1根线,因此循环K-1次。每次只修改一根线。最终改完a会踩在翻转前第K个结点的位置,b就是下一组了。
左边指向改变:原来是指向下一个结点的指针,要改为指向下一个K部分(此时该结点为本部分的尾端)。
右边被指向改变:原来是被上一个结点指向,要改为被上一个K部分指向(此时该结点为本部分的头部)。
在这里插入图片描述


代码(Java)——O(n)+O(1)
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode cur = dummy;
        while (true) {
            ListNode temp = cur;
            // 判断是否足K的长度
            for (int i = 0; i < k && temp != null; i ++) temp = temp.next;
            if (temp == null) break;

            ListNode first = cur.next, second = first.next;
            // 改变了K个结点之间K-1条链的方向
            for (int i = 0; i < k - 1; i ++) {
                ListNode secondNext = second.next;
                second.next = first;
                first = second;
                second = secondNext;
            }
            ListNode tempFirst = cur.next; 
            cur.next = first;
            tempFirst.next = second;
            cur = tempFirst;
        }
        return dummy.next;
    }
}
递归代码——O(n)+O(n)
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 检查是否还有K个结点
        ListNode cur = head;
        int count = 0;
        // 成功走K次后,到达下一组的头结点
        // 这里的cur很重要,同时对下一组的头结点进行了判断
        while (cur != null && count < k) {
            cur = cur.next;
            count ++;
        }

        if (count < k) return head;

        // 遍历完后firts就是翻转后的头结点
        ListNode first = head, second = first.next;
        for (int i = 0; i < k - 1; i ++) {
            ListNode secondNext = second.next;
            second.next = first;
            first = second;
            second = secondNext;
        }

        head.next = reverseKGroup(cur, k);
        return first;
    }
}

http://www.kler.cn/a/303052.html

相关文章:

  • 缓存与数据库不一致的解决方案:深入理解与实践
  • Spring Boot中的自动装配机制
  • Android Studio 将项目打包成apk文件
  • qt QProcess详解
  • Autosar CP 基于CAN的时间同步规范导读
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • UE5学习笔记21-武器的射击功能
  • MongoDB创建用户教程
  • Java铸基之路:运算符的深入学习!(上)
  • uni-app--》打造个性化壁纸预览应用平台(三)
  • HTML 转 PDF API 接口
  • 需求分析例题
  • 基于SpringBoot+Vue+MySQL的影院购票系统
  • SpringMvc 之处理器方法参数解析器(HandlerMethodArgumentResolver)
  • 前端vue项目服务器部署(docker)
  • [linux 驱动]platform总线设备驱动详解与实战
  • WEB渗透Linux提权篇-MYSQL漏洞提权
  • Spring Boot实现大文件分块上传
  • woocommerce 调用当前product_tag 为标题
  • swoole协程 是单线程的,还是多线程的
  • 数学建模笔记—— 整数规划和0-1规划
  • 跟我一起写 SIPp XML scenario file 之二
  • LeetCode 每日一题 2024/9/2-2024/9/8
  • OpenAI gym: Trouble installing Atari dependency (Mac OS X)
  • CVE-2024-38063 ipv6远程蓝屏
  • 基于SpringBoot+Vue+MySQL的招聘管理系统