【路飞】92. 反转链表 II

90 阅读1分钟

92. 反转链表 II

解决思路:串连法

  1. 记录left 前一个节点pre
  2. 待反转区域进行反转(l=pre.next;r=pre;, 走到right时将节点r截断获取待反转区域) 备注:r=pre.next;也是可以的,这里r=pre;只是为了从下标为0开始循环。
  3. 记录right后一个节点curr
  4. 串连起来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;
}

遇到的问题

边界问题

  1. 链表为空
  2. left=right
  3. left是第一个的时候

为什么要设置虚拟节点?

解决边界问题3:

我们的pre指针是要指向left的前一个节点,记录left之前的节点。当left是第一个的时候,不设置虚拟节点,pre的指向就会出错。

因此left是第一个的情况,为了保证pre能够指向left的前一个,需要设置虚拟节点,代码:

let pre = new ListNode(-1);

pre.next = head;

自述

算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。