递归思路
反转[left, right+1)区间内的链表,并返回新的头节点。
若left的前一个节点为p, 则p.next = 新的头节点。
但是由于p的指向,会出现一些边界需要考虑:
若p初始化为head时,只有当left为3时,p才能第一次迈出去。
若需要从头反转,则只能 return reverse(p, q);
若是从中间开始反转,p.next = reverse(p.next, q),此时head仍是反转后的头节点
代码
var reverseBetween = function(head, left, right) {
let p = head;
let q = head;
for(let i=1; i<left-1; i++){
p = p.next;
}
for(let i=1; i<=right; i++){
q = q.next;
}
if(left==1){
let newHead = reverse(p, q);
return newHead;
}else{
p.next = reverse(p.next, q);
return head;
}
};
var reverse = function(head, last){
if(head.next == last) return head;
let newHead = reverse(head.next, last);
head.next.next = head;
head.next = last;
return newHead;
}
迭代思路
先遍历找到head和end,然后对"反转整个链表"略作修改。
var reverse = function(head, end){
let pre = null;
let curr = head;
let nxt = curr.next;
stop = end.next;
while(curr!=stop){
nxt = curr.next;
curr.next = pre;
pre = curr;
curr = nxt;
}
head.next = curr;
return pre;
}