算法通过村第二关-链表黄金笔记|K个一组反转

这篇具有很好参考价值的文章主要介绍了算法通过村第二关-链表黄金笔记|K个一组反转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

提示:没有人天生就喜欢一种气味而讨厌另一种气味。文明的暗示而已。


链表反转|K个一组翻转链表

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

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

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

算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记
进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

思路来的很快,重点是代码层面的编写,这个很重要,思路呢?就是常见的头插法和穿针引线法来处理数组反转问题,当然今天我们也是采用这两种方法解决的,那就开始实现他吧😃

解题方法:

头插法处理:

头插法重点在理解虚拟节点上,如果这个问题解决了,相比较而言要比穿针引线要好实现的多😄, 我们试着把链表整体分为3段,一段是已经翻转的,一端是正在反转,一端是未反转的。为了方便翻转,我们需要京链表遍历一边,统计一下链表的长度len,然后将链表进行分组n=len/k,接下来就是循环进行分组翻转链表。 我们尝试这画一些图,能够更有里的说明:
算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记
结假设我们开始翻转 4 节点:
算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记
具体思路:

  1. 找到链表的长度 len 分组
  2. cur.next = cur.next.next; next.next = pre.next; pre.next = next;
  3. 循环下一次

上代码😄

	/**
     * 方法2:头插法
     *
     * @param head
     * @param k
     * @return
     */
    public static ListNode reverseKGroup2(ListNode head, int k) {
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode cur = head;
        int len = 0;
        while (cur != null) {
            cur = cur.next;
            len++;
        }
        int n = len / k; // 计算出来分几组
        ListNode pre = dummyNode;
        cur = head;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < k - 1; j++) {  // ? k - 1  画图就知道了
                ListNode next = cur.next;
                cur.next = cur.next.next;
                next.next = pre.next;
                pre.next = next;
            }
            pre = cur;  
            cur = cur.next;   // 记得修改指针
        }
       return dummyNode.next;
    }

穿针引线法处理:

这个思路可以回顾一下穿针引线,到底是怎么回事🤣

首先还是将链表分组翻转, 我们就可以一组一组的处理,把他们分成已经翻转的、正在翻转的和未翻转的三部分,同时为了方便处理头节点,我们使用了一个虚拟的节点。

接下来就是遍历,根据k个为一组找到四个关键位置,并使用变量per,start,end,next标记,比如下面的图:
算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记
接着我们就开始翻转,对应颜色进行翻转,我们将end.next = null ,直接使用链表翻转,复用链表翻转的常规操作。🤖注意指针的变化,head便是传入方法的参数,我们接着看图:
算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记

当然翻转之后,我们接下来就是将原始链表缝起来,这就需要调整指针域,同样这里也要注意指针的变化🤖
算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记
接着调整指针进行下一次循环:
算法通过村第二关-链表黄金笔记|K个一组反转,算法集训营,算法,链表,笔记
总结一下📝

  1. 遍历找到四个关键位置,复用常规翻转链表
  2. pre.next = end; start.next = next; 调整指针域
  3. 调整下一次循环

了解上面的图,代码应该也会写吧🥰

 /**
     * 方法1: 穿针引线法
     *
     * @param head
     * @param k
     * @return
     */
    public static ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode pre = dummyNode;
        ListNode end = dummyNode;
        while (end.next != null) { // 最终结束的地方
            for (int i = 0; i < k && end != null; i++) {
                end = end.next; // 找到当前分组的最后一个
            }
            if (end == null) {
                break;
            }
            // 找到start next
            ListNode start = pre.next;
            ListNode next = end.next;
            end.next = null; // 思考?
            pre.next = reverse(start);
            start.next = next;
            pre = end;

            // 调整下一次循环
            end = pre;
        }
        return dummyNode.next;
    }

复习一下链表反转💕:


 private static ListNode reverse(ListNode head) {
       ListNode pre = null;
       ListNode cur = head;
       while(cur != null) {
           ListNode next = cur.next;
           cur.next = pre;
           pre = cur;
           cur = next;
       }
       return pre;
    }

总结

注意:指针域的变化,多画图更容易理解,链表反转重点,重点,重点!!!文章来源地址https://www.toymoban.com/news/detail-634014.html

到了这里,关于算法通过村第二关-链表黄金笔记|K个一组反转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第二关——链表反转

    链表反转,就是链表原来是1-2-3-4-5,经过反转处理过后变成5-4-3-2-1 处理链表反转,有两种方式,一个是建立虚拟头结点,一个是直接操作链表反转。  这是执行的流程 最核心的两行就是 直接想我要让她反转,我现在设立了虚拟头结点,那我就要让新加进这个反转链表的结点

    2024年02月13日
    浏览(27)
  • 算法通关村第二关——终于学会链表

    LeetCode206 给我们单链表的头结点head,请你反转链表,并返回反转后的链表,如图所示: 本题有两种方法,分别为 建立虚拟头结点辅助反转 以及 直接操作链表实现反转 ,两种方法我将逐一分析讲解。 首先从名字分析一下这种方法,虚拟头结点,顾名思义,我们可以建立一个

    2024年02月15日
    浏览(35)
  • 算法通关村第二关,终于学会反转链表!

    文章目录 一、反转链表 总结 提示:以下是本篇文章正文内容,下面案例可供参考 反转链表主要是用三个指针,一个指针指向空,一个指向head第一个节点,一个在循环做的临时变量,在循环设置这个指针不用考虑head为空的情况,然后在循环改变指向后,向前移动一步,然后

    2024年02月14日
    浏览(33)
  • 算法通关村第二关——终于学会链表反转了

     方法一:建立虚拟头结点辅助反转 创建一个虚拟头节点,获取链表中每个节点,用虚拟头节点指向这个节点,并在链表中删除, 方法二:直接操作链表实现反转 记录当前节点(cur),前驱节点(pre),后继节点(next),先将当前节点的下一个节点指向前驱节点,然后将当前节点赋给前

    2024年02月14日
    浏览(39)
  • [Go版]算法通关村第二关——终于学会链表反转了

    题目链接:LeetCode-206. 反转链表 源码地址:GitHub-golang版本 说明:遍历该链表,依次取出当前节点插入到新链表的首位(虚拟头结点紧后)即可, 注意要提前保存当前节点的Next数据 ,否则插入到新链表后就没法继续向下遍历了。 说明:原理和方法1一致,只不过现在没有虚拟

    2024年02月14日
    浏览(32)
  • [Go版]算法通关村第二关青铜——终于学会链表反转了

    题目链接:LeetCode-206. 反转链表 源码地址:GitHub-golang版本 说明:遍历该链表,依次取出当前节点插入到新链表的首位(虚拟头结点紧后)即可, 注意要提前保存当前节点的Next数据 ,否则插入到新链表后就没法继续向下遍历了。 说明:原理和方法1一致,只不过现在没有虚拟

    2024年02月13日
    浏览(24)
  • 不简单的字符串转换问题(算法村第十二关青铜挑战)

    709. 转换成小写字母 - 力扣(LeetCode) 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 1 = s.length = 100 解 大写字母和小写字母的值之间存在固定的差异。例如,小写字母 a 的ASCII值为 97 ,而对应的大写字母 A 的ASCII值为 65 ,两者之差恰

    2024年01月25日
    浏览(37)
  • 算法通过村第十八关-回溯|青铜笔记|什么叫回溯(中篇)

    提示:阳光好的时候,会感觉还可以活很久,甚至可以活出喜悦。 --余秀华 回溯是非常重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题(这里埋个坑💣)例如组合、分割、子集、棋盘等等。从性能角度来看回溯算法的效率并不是很高,但是对于暴力也解决不了

    2024年02月06日
    浏览(32)
  • [Go版]算法通关村第十二关黄金——字符串冲刺题

    题目链接:LeetCode-14. 最长公共前缀 以第一个子字符串为标准,遍历其每个字符时,内嵌遍历其余子字符串的对应字符是否一致。不一致时,则返回当前字符之前的子字符串。 复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O ( n ∗ m ) 、空间复杂度 O ( 1 ) O(1) O ( 1 ) 时间复杂度:其中 n

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包