package main /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ // 1 <= m <= n <= len of list func reverseBetween(head *ListNode, m int, n int) *ListNode { var pre *ListNode curr, next := head, head.Next for cnt := 1; next != nil; cnt++ { if cnt == m { beforeBeg, beg := pre, curr for ; cnt != n; cnt++ { curr.Next = pre pre = curr curr = next next = next.Next } if beforeBeg != nil { // before beg -> end beforeBeg.Next = curr } else { head = curr // head is end } curr.Next = pre // end -> pre beg.Next = next // beg -> after end break } pre = curr curr = next next = next.Next } return head } // func main() { // n3 := ListNode{3, nil} // n2 := ListNode{2, &n3} // n1 := ListNode{1, &n2} // n0 := ListNode{0, &n1} // fmt.Println(list2str(reverseBetween(&n0, 3, 4))) // }