看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起。
题目
给你单链表的头指针head
和两个整数left
和right
,其中left<=right
。请你反转从位置left
到位置right
的链表节点,返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
解题思路
- 找到开始反转的节点
left
,记录下反转的前驱节点con
以及反转开始的节点(也是反转部分的尾结点)tail
- 开始反转操作
- 反转到
right
,此时反转的链表最后的一个节点(也是反转部分的头结点)为pre
,后置节点cur
- 将我们一开始记录的前驱节点
con
指向pre
,反转部分的尾结点tail
指向cur
便可完成解题
解题代码
var reverseBetween = function(head, left, right) {
if(!head||left == right) return head
let count = right - left +1
let vnode = new ListNode(-1,head)
let pre = vnode
let cur = pre.next
while (--left){
pre = pre.next
}
pre.next = reverseList(pre.next,count)
return vnode.next
}
var reverseList = function(head,n) {
let pre =null
let cur = head
while (n--){
[cur.next,pre,cur] = [pre,cur,cur.next]
}
head.next = cur
return pre
};