86.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // ListNode ...
  6. type ListNode struct {
  7. Val int
  8. Next *ListNode
  9. }
  10. func list2str(head *ListNode) string {
  11. curr := head
  12. str := make([]rune, 0)
  13. for curr != nil {
  14. str = append(str, rune(curr.Val+'0'))
  15. curr = curr.Next
  16. }
  17. return string(str)
  18. }
  19. /**
  20. * Definition for singly-linked list.
  21. * type ListNode struct {
  22. * Val int
  23. * Next *ListNode
  24. * }
  25. */
  26. func partition(head *ListNode, x int) *ListNode {
  27. if head == nil || head.Next == nil {
  28. return head
  29. }
  30. dummy := ListNode{0, head}
  31. fast, slow := &dummy, &dummy
  32. // slow -> body -> fast -> target -> tail
  33. // => slow -> target -> body -> fast -> tail
  34. // => slow -> body -> fast -> tail
  35. // or fast/slow -> tail
  36. for fast != nil {
  37. if fast.Next != nil && fast.Next.Val < x {
  38. if fast == slow {
  39. fast = fast.Next
  40. } else {
  41. tail := fast.Next.Next
  42. fast.Next.Next = slow.Next
  43. slow.Next = fast.Next
  44. fast.Next = tail
  45. }
  46. slow = slow.Next
  47. } else {
  48. fast = fast.Next
  49. }
  50. }
  51. return dummy.Next
  52. }
  53. func main() {
  54. l15 := ListNode{5, nil}
  55. l14 := ListNode{0, &l15}
  56. l13 := ListNode{6, &l14}
  57. l12 := ListNode{3, &l13}
  58. l1 := &ListNode{7, &l12}
  59. fmt.Println(list2str(partition(l1, 6)))
  60. fmt.Println(list2str(partition(nil, 9)))
  61. l23 := ListNode{3, nil}
  62. l22 := ListNode{2, &l23}
  63. l2 := &ListNode{1, &l22}
  64. fmt.Println(list2str(partition(l2, 9)))
  65. }