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

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

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

    示例 1:
    image.png
    输入: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]

    1. /**
    2. * Definition for singly-linked list.
    3. * function ListNode(val, next) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.next = (next===undefined ? null : next)
    6. * }
    7. */
    8. /**
    9. * @param {ListNode} head
    10. * @param {number} k
    11. * @return {ListNode}
    12. */
    13. var reverseKGroup = function (head, k) {
    14. if (head === null) return null;
    15. let a = b = head;
    16. for (let i = 0; i < k; i += 1) {
    17. if (b === null) return head;
    18. b = b.next;
    19. }
    20. // 反转前 K 个元素
    21. let newHead = reverse(a, b);
    22. a.next = reverseKGroup(b, k);
    23. return newHead
    24. };
    25. const reverse = (a, b) => {
    26. let pre = null;
    27. let cur = a;
    28. let nxt = a;
    29. // while 终止的条件改一下就行了
    30. while (cur !== b) {
    31. nxt = cur.next;
    32. cur.next = pre;
    33. pre = cur;
    34. cur = nxt;
    35. }
    36. // 返回反转后的头结点
    37. return pre;
    38. }

    image.png