25.go 1.4 KB

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