题解 | #链表内指定区间反转#
链表内指定区间反转
http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
这里使用的方法比较复杂: 1.遍历链表并且使用切片接收 2.切片指定范围的翻转(切片的切片): 1.根据切片的切片长度指定for循环终止条件 2.交换 3.将切片的每个元素指定连接关系,最后一个元素的Next赋为nil 4.输出切片的首结点
func reverseBetween(head *ListNode, m int, n int) *ListNode {
// write code here
var res []*ListNode
for head != nil {
res = append(res, head)
head = head.Next
}
SwapRes(res[m-1 : n])
node := outRes(res)
return node
}
func outRes(res []*ListNode) *ListNode {
for i := 0; i < len(res)-1; i++ {
if res[i] != nil {
res[i].Next = res[i+1]
}
res[len(res)-1].Next = nil
}
return res[0]
}
func SwapRes(res []*ListNode) {
var l int
if len(res)%2 == 0 {
l = len(res) >> 1
} else {
l = (len(res) - 1) >> 1
}
for i := 0; i < l; i++ {
tmp := res[i]
res[i] = res[len(res)-1-i]
res[len(res)-1-i] = tmp
}
}