• 备战蓝桥杯————k个一组反转单链表


            k个反转单链表,顾名思义就是k个节点为一组进行反转,这是一道困难的题目,如何解答,可以在我们前面的反转链表中得到思路。

    如何 K 个一组反转单链表

    题目描述

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

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

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

    示例 1:

    输入:head = [1,2,3,4,5], k = 2
    输出:[2,1,4,3,5]
    

    示例 2:

    输入:head = [1,2,3,4,5], k = 3
    输出:[3,2,1,4,5]
    

    提示:

    • 链表中的节点数目为 n
    • 1 <= k <= n <= 5000
    • 0 <= Node.val <= 1000

    进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

    解题思路及代码

    1. 先反转以 head 开头的 k 个元素。
    2. 将第 k + 1 个元素作为 head,递归调用 reverseKGroup 函数。
    3. 将上述两个过程的结果连接起来。

          这种递归的思路非常巧妙,通过不断地递归调用自身,将问题分解成规模更小的子问题,并最终将这些子问题的解合并起来得到原问题的解。在代码实现时,确实需要考虑如何处理 base case,即当剩余的节点不足 k 个时的情况。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode reverseKGroup(ListNode head, int k) {
    13. if(head==null)return null;
    14. ListNode a=head,b=head;
    15. for(int i=0;i
    16. if(b==null)return head;
    17. b=b.next;
    18. }
    19. ListNode newhead= reverse(a,b);
    20. a.next=reverseKGroup(b,k);
    21. return newhead;
    22. }
    23. ListNode reverse(ListNode a, ListNode b) {
    24. ListNode pre, cur, next;
    25. pre=null;
    26. cur=a;
    27. next=a;
    28. while(cur!=b){
    29. next=cur.next;
    30. cur.next=pre;
    31. pre=cur;
    32. cur=next;
    33. }
    34. return pre;
    35. }
    36. }

    结果展示

  • 相关阅读:
    Java中的并发编程模型和常用工具类
    MySQL系列一:账号管理与引擎
    C多维数组指针(学习笔记)
    python基于用户兴趣的java影视推荐系统django
    《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组对角矩阵
    Zookeeper
    自学SAP是学习ECC版本还是S4版本?
    pytorch的backward()的底层实现逻辑
    Scrapy爬虫方法
    day01-ES6新特性以及ReactJS入门
  • 原文地址:https://blog.csdn.net/2201_75381449/article/details/136334022