原文:92. 反转链表 II(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-092/

题目:

难度:Middle

相关话题:链表

反转从位置 mn 的链表。请使用一趟扫描完成反转。

说明: 1 ≤mn ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

思路:

反转链表需要一个一个节点来处理。

例如 [1->2->3->4->5],m=2,n=4

反转从第2个节点开始,我们首先要找到头部节点(第1个节点),因为后续所有的反转都是在第1个节点的next上处理的。

同时,我们需要找到一个尾巴节点,例如反转3的时候,节点2就是尾巴节点,它的作用就是将要反转的3后面的节点连接起来。

这两个节点头部节点(1)尾巴节点(2)是不变的。

当反转3时,将13相连,32相连,24相连;

当反转4时,将14相连,43相连,25相连。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} m
 * @param {number} n
 * @return {ListNode}
 */
var reverseBetween = function(head, m, n) {
  let root=new ListNode(null)
  let k=n-m
  root.next=head
  let node=root
  while(m-->1)node=node.next
  let startNode=node,tailNode=node.next
  node=node.next.next
  while(k-->0){
    let secondNode=startNode.next
    let nxt=node.next
    startNode.next=node
    node.next=secondNode
    tailNode.next=nxt
    node=nxt
  }
  return root.next
};

扩展阅读: