https://leetcode-cn.com/problems/reverse-linked-list-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) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} m
* @param {number} n
* @return {ListNode}
*/
var reverseBetween = function(head, m, n) {
let prev = null
let curr = head
// 移动需要反转的指针
for(let i=1;i<m;i++) {
prev = curr
curr = curr.next
}
// 标记指针
let prev2 = prev
let curr2 = curr
// 遍历m到n的节点进行反转
for(let i=m;i<=n;i++) {
// next = curr.next
// curr.next = prev
// prev = curr
// curr = next
[curr.next, prev, curr] = [prev, curr, curr.next]
}
// m > 1,反转开始节点在链表中间
if(prev2 !== null) {
prev2.next = prev
// 反转开始节点在链表开头
}else {
head = prev
}
curr2.next = curr
return head
};