题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

#test02  链表内指定区间反转
重点:头插法(保证链表第一个节点不乱跑,稳定整条链)、找到m位置、区间内反转,注意返回值
还是太菜,但是算法题很上头
/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
function reverseBetween(head, m, n) {
  // write code here
  //m等于n 不需要翻转
  if (m === n) {
    return head;
  }
  //链表为空或链表长度为1不需要翻转
  if (head == null || head.next == null) {
    return head;
  }
  //定义一个新表头指向head  头插法!
  let newHead = new ListNode(-1);
  newHead.next = head;

  //先遍历找到m的位置,
  let pre = newHead;
  for (let i = 1; i < m; i++) {
    pre = pre.next;
  }
  //找到m的位置:pre(翻转链表,这里pre相当于 m-n链 表头位置),从m开始翻转到n
  let p1 = pre.next, p2;
  for (let i = m; i < n; i++) {
    p2 = p1.next;
    p1.next = p2.next;
    p2.next = pre.next;
    pre.next = p2;
  }
  //翻转完毕,返回的newHead.next(因为newHead是相对前移一位的)
  return newHead.next;
}
module.exports = {
  reverseBetween: reverseBetween,
};


#前端##算法学习#
全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务