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

链表内指定区间反转

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;
}

全部评论

相关推荐

01-02 21:17
已编辑
西安理工大学 后端
程序员小白条:项目不太重要,你的优势的算法竞赛,然后多背相关的八股文,项目可以不作为重点考虑,面试可能就简单带过项目就行了,你可以直接写简历,背项目相关的八股文就行,也不用自己做,时间紧张的情况下,性价比最高
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务