题解 | #链表内指定区间反转#
链表内指定区间反转
http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
首先需要找到第 m-1 和第 n+1 节点,分别用 start 和 end 保存
m - 1表示:开始反转的前一个节点,注意如果m = 1,那么从head节点就开始反转了,start就是null n + 1表示:结束反转的后一个节点,可能是一个节点,也可能是null,不过都一样
第一个for循环就是寻找 start 和 end
接下来的while循环里,需要三个指针,pre,cur,next去记录每次循环的节点,然后通过 cur.next = pre 实现反转。这里需要对 m === 1 分开讨论
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
function reverseBetween( head , m , n ) {
// 如果m === n,则不需要翻转
if(m === n){
return head
}
// 如果只有一个节点也不需要翻转
if(head == null || head.next == null){
return head
}
// start指向开始反转节点的前一个节点, 即 m - 1
// end指向 n + 1
let cur = head
let start = null
let end = null
// 寻找start和end
for(let i = 1; i <= n; i++){
if(i === m - 1){
start = cur
}
cur = cur.next
}
end = cur
let pre = null
let next = null
// 如果起始节点不是头节点,说明start有值
if(m > 1){
cur = start.next
while(cur !== end){
next = cur.next
cur.next = pre
pre = cur
cur = next
}
start.next.next = end
start.next = pre
} else { // 起始节点就是头节点,start没有值
cur = head
while(cur !== end){
next = cur.next
cur.next = pre
pre = cur
cur = next
}
head.next = end
head = pre
}
return head
}