一、反转链表
var reverseList = function(head) { if (head == null || head.next == null) { return head; } const last = reverseList(head.next); head.next.next = head; head.next = null; return last;};
二、反转前n部分
let successor = null; // 后驱节点let reverseListN = function(head, n) { if (n === 1) { // 记录第 n + 1 个节点 successor = head.next; return head; } // 以 head.next 为起点,需要反转前 n - 1 个节点 let last = reverseListN(head.next, n - 1); head.next.next = head; // 让反转之后的 head 节点和后面的节点连起来 head.next = successor; return last;};
三、反转(m, n)
let successor = null; // 后驱节点let reverseListN = function(head, n) { if (n === 1) { // 记录第 n + 1 个节点 successor = head.next; return head; } // 以 head.next 为起点,需要反转前 n - 1 个节点 let last = reverseListN(head.next, n - 1); head.next.next = head; // 让反转之后的 head 节点和后面的节点连起来 head.next = successor; return last;};/** * @param {ListNode} head * @param {number} m * @param {number} n * @return {ListNode} */let reverseBetween = function(head, m, n) { // base case if (m === 1) { return reverseListN(head, n); } // 前进到反转的起点触发 base case head.next = reverseBetween(head.next, m - 1, n - 1); return head;};