92. 反转链表 II

287 阅读1分钟

92. 反转链表 II

思路

  1. 先找到left对应的节点,还有一起找到的是prev_head;
  2. 提前保存好left节点
  3. 然后,将left到right之间的节点反转,这里使用普通的双指针反转链表;
  4. left节点的next指向,后面的head节点
  5. 判断prev_head 是不是null , 也就是说,left是不是1
  6. 如果是1的话,那么result 就是new_head; 不是1的话,就是正常的,prev_head指向new_head
/**
 * 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) {
    let change_len = right - left + 1;

    // 先指针找到left

    let pre_head = null;
    let result = head;

    while (head && --left) {
        pre_head = head;
        head = head.next;
    }

    let modify_list = head;
    let new_head = null;

    while (head && change_len) {
        let tmp = head.next;
        head.next = new_head;
        new_head = head;
        head = tmp;
        change_len--;
    }

    // modify_list 是反转之后的尾结点
    modify_list.next = head;
    if (pre_head) {
        pre_head.next = new_head;
    } else {
        result = new_head;
    }
    return result;
};