来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/reverse-nodes-in-k-group 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

解答

把反转链表方法提取出来

  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 reverseGroup = function (head, targetNode) {
  14. let prevNode = null;
  15. while (true) {
  16. const next = head.next;
  17. head.next = prevNode;
  18. prevNode = head;
  19. if (head === targetNode) {
  20. return;
  21. }
  22. head = next;
  23. }
  24. }
  25. var reverseKGroup = function(head, k) {
  26. let firstNode = head,
  27. returnFirstNode = null,
  28. prevLastNode = null;
  29. let i = 1;
  30. while (head) {
  31. const nextNode = head.next;
  32. if (i === k) {
  33. i = 0;
  34. const lastNode = head;
  35. if (returnFirstNode === null) {
  36. returnFirstNode = lastNode;
  37. }
  38. if (prevLastNode) {
  39. prevLastNode.next = lastNode;
  40. }
  41. head.next = null;
  42. reverseGroup(firstNode, lastNode);
  43. firstNode.next = null;
  44. prevLastNode = firstNode;
  45. firstNode = nextNode;
  46. }
  47. head = nextNode;
  48. ++i;
  49. }
  50. if (i > 0) {
  51. prevLastNode.next = firstNode;
  52. }
  53. return returnFirstNode;
  54. };