将一个链表m 位置到n 位置之间的区间反转,要求时间复杂度
,空间复杂度
。
例如:
给出的链表为
,
,
返回
.
注意:
给出的
,
满足以下条件:
思路:找到m的位置,开始反转链表,跟普通反转链表不同的是,他需要记录m的前一个位置,方便把m-n这部分的头拼接上,还需要记录n的后一个位置,把这个链表的尾接上,防止head发生变化,新建一个新的head。
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
func reverseBetween( head *ListNode , m int , n int ) *ListNode {
// write code here
if m == n {
return head
}
first := new(ListNode)
first.Next = head
node := head
var start *ListNode
var stop *ListNode
var last *ListNode
var pre = first
for node != nil {
m--
n--
if m == 0 {
last = pre
start = node
}
if n == 0 {
stop = node.Next
node.Next = nil
}
pre = node
node = node.Next
}
if last != nil {
last.Next = nil
}
node = new(ListNode)
node.Next = start
pre = nil
for start != nil {
tmp := start.Next
start.Next = pre
pre = start
start = tmp
}
if last != nil {
last.Next = pre
}
node.Next.Next = stop
return first.Next
}
这篇博客探讨了如何在O(1)空间复杂度和O(n)时间复杂度下,对链表的指定区间[m, n]进行反转。通过创建辅助节点,找到m和n的位置,然后进行反转操作,最后将反转部分正确地重新连接到原始链表中。示例展示了如何处理这种问题,并给出了相应的解决方案。
2115

被折叠的 条评论
为什么被折叠?



