25.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package main
  2. import "fmt"
  3. /**
  4. * Definition for singly-linked list.
  5. * type ListNode struct {
  6. * Val int
  7. * Next *ListNode
  8. * }
  9. */
  10. func reverseKGroup(head *ListNode, k int) *ListNode {
  11. if head == nil || head.Next == nil || k <= 1 {
  12. return head
  13. }
  14. beforeBeg, beg, end, afterEnd := (*ListNode)(nil), head, head, head.Next
  15. for end.Next != nil {
  16. counter := 1
  17. for end.Next != nil && counter < k {
  18. end = end.Next
  19. afterEnd = end.Next
  20. counter++
  21. }
  22. if counter != k {
  23. // Dont need to reverse
  24. return head
  25. }
  26. // Reverse k node from beg to end
  27. prev, curr, next := beforeBeg, beg, beg.Next
  28. // Reverse all link between beforBeg & afterEnd
  29. for i := 1; i < k; i++ {
  30. prev = curr
  31. curr = next
  32. next = next.Next
  33. curr.Next = prev
  34. }
  35. if beforeBeg == nil {
  36. head = end
  37. } else {
  38. beforeBeg.Next = end
  39. }
  40. beg.Next = afterEnd
  41. // Update anchor node
  42. beforeBeg = beg
  43. beg = beforeBeg.Next
  44. end = beg
  45. if end == nil {
  46. return head
  47. }
  48. afterEnd = end.Next
  49. }
  50. return head
  51. }
  52. func main() {
  53. // 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
  54. n7 := ListNode{7, nil}
  55. n6 := ListNode{6, &n7}
  56. n5 := ListNode{5, &n6}
  57. n4 := ListNode{4, &n5}
  58. n3 := ListNode{3, &n4}
  59. n2 := ListNode{2, &n3}
  60. n1 := ListNode{1, &n2}
  61. fmt.Println(list2str(&n1))
  62. fmt.Println(list2str(reverseKGroup(&n1, 5)))
  63. // 0
  64. n0 := ListNode{0, nil}
  65. fmt.Println(list2str(reverseKGroup(&n0, 1)))
  66. }