反转链表部分链表
反转链表 II
题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
题解
递归
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} left
* @param {number} right
* @return {ListNode}
*/
var reverseBetween = function(head, left, right) {
if(!head) return null;
// 当left=1的时候就转换为了翻转前n个结点
if(left === 1) return reverseN(head,right);
// left前的结点不变,直至left变为1
head.next = reverseBetween(head.next,left-1,right-1);
return head;
};
let successor = null;
const reverseN = function(head,n){
if(!head) return null;
if(n == 1){
// 记录后置结点
successor = head.next;
return head;
}
// 下一节点的翻转前n-1个结点后的头结点
const _last = reverseN(head.next,n-1);
// 重新链接head结点
head.next.next = head;
head.next = successor;
return _last;
}
最后更新于