当前位置:   article > 正文

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

备战蓝桥杯————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<k;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. }

结果展示

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号