看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起。
题目
给你单链表的头指针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]
提示:
- 链表中节点数目为
n1 <= n <= 500-500 <= Node.val <= 5001 <= 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
};