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

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

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

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

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

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

说明:

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

4指针

IMG_20210318_164537.jpg

  1. const partReverse = (fisrt, second) => {
  2. let pre = null;
  3. let cur = fisrt;
  4. // cur==second的时候还要反转一次,
  5. // 所以是pre到second才停下
  6. while (pre !== second) {
  7. const next = cur.next;
  8. cur.next = pre;
  9. pre = cur;
  10. cur = next;
  11. }
  12. return [second, fisrt];
  13. }
  14. const reverseKGroup = function (head, k) {
  15. const dummyHead = new ListNode(0);
  16. dummyHead.next = head;
  17. let pre = dummyHead;
  18. let fisrt = head;
  19. while (fisrt) {
  20. // second初始化为pre
  21. let second = pre;
  22. // 查看剩余部分长度是否大于等于 k
  23. for (let i = 0; i < k; ++i) {
  24. second = second.next;
  25. if (!second) {
  26. return dummyHead.next;
  27. }
  28. }
  29. // 此时second来到要反转的最后一个元素
  30. // [first, second] 即为要反转的范围
  31. const next = second.next;
  32. [fisrt, second] = partReverse(fisrt, second);
  33. // 把子链表重新接回原链表
  34. // 改变指向
  35. pre.next = fisrt;
  36. second.next = next;
  37. // 更新位置
  38. pre = second;
  39. fisrt = next;
  40. }
  41. return dummyHead.next;
  42. };