92.go 910 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package main
  2. /**
  3. * Definition for singly-linked list.
  4. * type ListNode struct {
  5. * Val int
  6. * Next *ListNode
  7. * }
  8. */
  9. // 1 <= m <= n <= len of list
  10. func reverseBetween(head *ListNode, m int, n int) *ListNode {
  11. var pre *ListNode
  12. curr, next := head, head.Next
  13. for cnt := 1; next != nil; cnt++ {
  14. if cnt == m {
  15. beforeBeg, beg := pre, curr
  16. for ; cnt != n; cnt++ {
  17. curr.Next = pre
  18. pre = curr
  19. curr = next
  20. next = next.Next
  21. }
  22. if beforeBeg != nil { // before beg -> end
  23. beforeBeg.Next = curr
  24. } else {
  25. head = curr // head is end
  26. }
  27. curr.Next = pre // end -> pre
  28. beg.Next = next // beg -> after end
  29. break
  30. }
  31. pre = curr
  32. curr = next
  33. next = next.Next
  34. }
  35. return head
  36. }
  37. // func main() {
  38. // n3 := ListNode{3, nil}
  39. // n2 := ListNode{2, &n3}
  40. // n1 := ListNode{1, &n2}
  41. // n0 := ListNode{0, &n1}
  42. // fmt.Println(list2str(reverseBetween(&n0, 3, 4)))
  43. // }