Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
题目
描述
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)。
数据范围: 链表长度 0 < size ≤1000,0 < m ≤ n ≤ size,链表中每个节点的值满足 0 <∣val∣≤1000
要求:时间复杂度 O(n),空间复杂度 O(n)
进阶:时间复杂度 O(n),空间复杂度 O(1)
示例1
输入:
{1,2,3,4,5},2,4
返回值:
{1,4,3,2,5}
示例2
输入:
{5},1,1
返回值:
{5}
思路
思路其实很明确,就是反转第n到m个节点上的链表操作。然后把最后一个接上去即可。不过要注意接上去的节点信息。
AC Code
func reverseBetween( head *ListNode , m int , n int ) *ListNode {
pre := &ListNode{Next:head}
for i:=0; i<m-1; i++ {
(1) pre = pre.Next
}
(2) pre.Next = reserve(pre.Next,n-m+1)
return head
}
func reserve(root *ListNode, k int) *ListNode {
var pre,curNext *ListNode
cur := root
(3) for i:=0; i<k; i++ {
curNext = cur.Next
cur.Next = pre
pre = cur
cur = curNext
}
(4) root.Next = curNext
return pre
}
- (1) 一直遍历,直到这个遇到这个节点为止。即是找到开始反转的节点。
- (2) 让这个节点的下一个等于反转后的节点
- (3) 进行反转,创建前中后的节点信息,让这三个不断向前迭代循环反转。
- (4) 反转完特定节点后,让这个root的下一个节点等于接下来的节点。