将一个链表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
}