
思路
- 分别记录left前一个节点,right后一个节点
- 反转[left,right]区间的链表
- 拼接
func reverseBetween(head *ListNode, left int, right int) *ListNode {
count := 1
cur := head
subHead, pre, post := (*ListNode)(nil), (*ListNode)(nil), (*ListNode)(nil)
for count <= right {
if count == left {
subHead = cur
}
if count < left {
pre = cur
}
if count == right {
post = cur.Next
cur.Next = nil
break
}
cur = cur.Next
count++
}
newHead, newTail := reverse(subHead)
if pre != nil {
pre.Next = newHead
newTail.Next = post
return head
}
newTail.Next = post
return newHead
}
func reverse(head *ListNode) (newHead *ListNode, newTail *ListNode){
if head == nil || head.Next == nil {
return head, head
}
newTail = head
pre, cur, next := (*ListNode)(nil), head, head
for cur.Next != nil {
next = cur.Next
cur.Next = pre
pre = cur
cur = next
}
cur.Next = pre
newHead = cur
return
}