算法通关村第二关——K个一组反转

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

前面有很多关于链表反转的知识,K个一组反转,就是让很多组节点进行翻转,本质也都是一样的。

头插法

public ListNode reverseKGroup(ListNode head, int k) {
    ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;
    Listnode cur = head;
    // 先计算出链表的长度
    int len = 0; 
    while (cur != null) {
        len++;
        cur = cur.next;
    }
    // 计算出有几组
    int n = len / k; 
    ListNode pre = dummyNode;
    cur = head;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < k - 1; j++) {
            ListNode next = cur.next;
            cur.next = cur.next.next;
            next.next = pre.next;
            pre.next = next;
        }
        pre = cur;
        cur = cur.next;
    }
    return dummyNode.next;
}

现在的链表是 3->2->1->4->5->6->7->8

3->2->1已经进行了反转,现在要进行反转的是4->5->6

在这里首先计算出链表的长度,然后计算出要反转几组,现在定义pre为dummyNode,cur定义为head。

通过for循环来控制反转哪组,每组反转到了哪

第一个for循环,就是用来控制反转哪组的。

第二个for循环,就拿图中的中间的正在反转那部分来说,在第二个for循环中,ListNode next = cur.next先把当前节点的next提出来,cur现在指的是4,然后开始反转,让当前节点的下一个节点指到6,让原本链表中5的下一个节点指到4,再让pre,也就是当前反转的这一组链表的前面的一个节点,让pre的下一个节点指向5,这样就完成了第一次的反转。

在这里,我纠结了很长时间的一点,明明没有对cur进行变换,那么为什么在第二个for循环中的第二次循环还可以继续执行前一次的代码呢,后来才发现,cur一直指的就是4这个节点,自然也就不需要对cur进行变换了。

在第二个for循环执行完成后,pre = curcur = cur.next,这两行代码就又回到了正常反转链表的代码了,把pre指到了cur,让cur指到了下一个节点,这样就可以一直反转了,还可以很灵活的控制反转哪部分。文章来源地址https://www.toymoban.com/news/detail-630898.html

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

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

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

相关文章

  • 算法通关村第二关——终于学会链表反转了

     方法一:建立虚拟头结点辅助反转 创建一个虚拟头节点,获取链表中每个节点,用虚拟头节点指向这个节点,并在链表中删除, 方法二:直接操作链表实现反转 记录当前节点(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)
  • 算法通关村第十二关——字符串反转问题解析

    字符串反转是关于字符串算法里的重要问题,虽然不是太难,但需要考虑到一些边界问题。本篇文章就对几道字符串反转题目进行分析。 力扣344题,编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,

    2024年02月10日
    浏览(35)
  • K 个一组翻转链表(链表反转,固定长度反转)(困难)

    优质博文:IT-BLOG-CN 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进

    2024年01月19日
    浏览(26)
  • 算法通关村第二关——单链表加一

    LeetCode369 用一个非空单链表来表示一个非负整数,然后将这个整数加一。你可以假设这个整数除了 0 本身,没有任何前导的 0.这个证书的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。 计算是从低位开始的,而链表是从高位开始的,所以要处理就必须反转过来

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

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

    2024年02月15日
    浏览(35)
  • 算法村第二关(1)——手写链表反转

    题目:Leetcode-206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 对于链表反转的问题,想起来其实非常简单。 就是从前往后,将节点一个一个采用头插法的做成一个新链表嘛,这样新链表就是旧链表的反转链表啦! 那既然这么简单,为什么还要学

    2024年02月14日
    浏览(31)
  • 算法通关村十二关 | 字符串前缀问题

    题目:LeetCode14,14. 最长公共前缀 - 力扣(LeetCode) 我们先看公共前缀有什么特点。 第一种方式,竖着比较,如图左边所示,选取数组中第一个字符串的位置,每前进一个就比较各个字符串,看是否相等,只有某一轮遇到不相等,则结束返回结果。 还是这张图         如

    2024年02月11日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包