一、反转链表

  1. var reverseList = function(head) {
  2. if (head == null || head.next == null) {
  3. return head;
  4. }
  5. const last = reverseList(head.next);
  6. head.next.next = head;
  7. head.next = null;
  8. return last;
  9. };

二、反转前n部分

  1. let successor = null; // 后驱节点
  2. let reverseListN = function(head, n) {
  3. if (n === 1) {
  4. // 记录第 n + 1 个节点
  5. successor = head.next;
  6. return head;
  7. }
  8. // 以 head.next 为起点,需要反转前 n - 1 个节点
  9. let last = reverseListN(head.next, n - 1);
  10. head.next.next = head;
  11. // 让反转之后的 head 节点和后面的节点连起来
  12. head.next = successor;
  13. return last;
  14. };

三、反转(m, n)

  1. let successor = null; // 后驱节点
  2. let reverseListN = function(head, n) {
  3. if (n === 1) {
  4. // 记录第 n + 1 个节点
  5. successor = head.next;
  6. return head;
  7. }
  8. // 以 head.next 为起点,需要反转前 n - 1 个节点
  9. let last = reverseListN(head.next, n - 1);
  10. head.next.next = head;
  11. // 让反转之后的 head 节点和后面的节点连起来
  12. head.next = successor;
  13. return last;
  14. };
  15. /**
  16. * @param {ListNode} head
  17. * @param {number} m
  18. * @param {number} n
  19. * @return {ListNode}
  20. */
  21. let reverseBetween = function(head, m, n) {
  22. // base case
  23. if (m === 1) {
  24. return reverseListN(head, n);
  25. }
  26. // 前进到反转的起点触发 base case
  27. head.next = reverseBetween(head.next, m - 1, n - 1);
  28. return head;
  29. };