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

链表内指定区间反转

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

/*class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * @param head ListNode类
 * @param m int整型
 * @param n int整型
 * @return ListNode类
 */
export function reverseBetween(head: ListNode, m: number, n: number): ListNode {
  // write code here
  if (m >= n) return head;
  // 确保肯定m < n
  // 前中后三个指针连贯移动来反转 m~n 位置之间的链表指向
  let front = null; // 前指针
  /**
  * 用mid指针指向当前要调整其next的节点
  */
  let mid: ListNode | null = head; // 中间指针
  let back = null; // 后指针
  /**
  * 用mp指针定位m位置的节点
  */
  let mp = null; // m位置的节点
  let count = 1; // 移动计数
  while (mid) {
    back = mid.next;
    if (count >= m) {
      // 找到了要反转的起始节点
      mid.next = front;
      if (count === m) {
		// 若此时就在m位置,则用mp指针标记住
        mp = mid;
      }
    }
    if (count === n) {
      // 此时mid指向n位置节点,结束遍历,此时mid指向要反转的最后一个节点
      break;
    }
    front = mid;
    mid = back;
    count++;
  }
  front = (mp as ListNode).next;
  if (front) {
	// front不为null说明m不为1
    front.next = mid;
    (mp as ListNode).next = back;
    return head;
  }
  // front为null说明m===1
  (mp as ListNode).next = back;
  return mid as ListNode;
}

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务