1. 题目描述

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

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

    2. 解题思路

    这道题目可以使用递归求解,具体实现思路如下:

  • 启用一个计数器,截出链表的钱k个节点

  • 将链表进行反转
  • 将上一次遍历时最后的节点,作为当前的开始节点,进行递归操作

    3. 代码实现

    1. /**
    2. * Definition for singly-linked list.
    3. * function ListNode(val) {
    4. * this.val = val;
    5. * this.next = null;
    6. * }
    7. */
    8. /**
    9. * @param {ListNode} head
    10. * @param {number} k
    11. * @return {ListNode}
    12. */
    13. var reverseKGroup = function(head, k) {
    14. let cur = head
    15. let count = 0
    16. while(cur !== null && count !== k){
    17. cur = cur.next
    18. count++
    19. }
    20. if(count == k){
    21. cur = reverseKGroup(cur, k)
    22. // 翻转链表
    23. while(count !== 0){
    24. count--
    25. let tmp = head.next
    26. head.next = cur
    27. cur = head
    28. head = tmp
    29. }
    30. head = cur
    31. }
    32. return head
    33. };

    4. 提交结果

    25.  K 个一组翻转链表 - 图1