92. 反转链表 II
解决思路:串连法
- 记录left 前一个节点pre
- 待反转区域进行反转(
l=pre.next;r=pre;, 走到right时将节点r截断获取待反转区域) 备注:r=pre.next;也是可以的,这里r=pre;只是为了从下标为0开始循环。 - 记录right后一个节点curr
- 串连起来
pre.next=r; l.next=curr;
/**
* 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 == null || left == right) return head;
let node = new ListNode(-1);
node.next = head;
let pre=node;
for(var i=0; i<left-1; i++){
pre = pre.next;
}
let l = pre.next;
let r = pre;
for(var i=0; i<right-left+1; i++){
r = r.next;
}
let curr = r.next;
pre.next = null;
r.next = null;
reverse2(l);
pre.next = r;
l.next = curr
return node.next;
// return head;
};
function reverse2(head2){
if(head2 == null || head2.next == null) return head2;
let pre=null, curr=head2, nxt=head2.next;
while(curr != null) {
curr.next = pre;
pre = curr;
(curr = nxt) && (nxt = nxt.next);
}
return pre;
}
遇到的问题
边界问题
- 链表为空
- left=right
- left是第一个的时候
为什么要设置虚拟节点?
解决边界问题3:
我们的pre指针是要指向left的前一个节点,记录left之前的节点。当left是第一个的时候,不设置虚拟节点,pre的指向就会出错。
因此left是第一个的情况,为了保证pre能够指向left的前一个,需要设置虚拟节点,代码:
let pre = new ListNode(-1);
pre.next = head;
自述
算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。