题目:
难度:Middle
相关话题:链表
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明: 1 ≤m ≤n ≤ 链表长度。
示例:
输入: 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
时,将1
和3
相连,3
和2
相连,2
和4
相连;
当反转4
时,将1
和4
相连,4
和3
相连,2
和5
相连。
/**
* @来源: 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
};
扩展阅读: