24.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package main
  2. import "fmt"
  3. type ListNode struct {
  4. Val int
  5. Next *ListNode
  6. }
  7. func list2str(head *ListNode) string {
  8. curr := head
  9. str := make([]rune, 0)
  10. for curr != nil {
  11. str = append(str, rune(curr.Val+'0'))
  12. curr = curr.Next
  13. }
  14. return string(str)
  15. }
  16. /**
  17. * Definition for singly-linked list.
  18. * type ListNode struct {
  19. * Val int
  20. * Next *ListNode
  21. * }
  22. */
  23. // before -> curr -> curr.Next -> after
  24. func swapPairsOld(head *ListNode) *ListNode {
  25. if head == nil || head.Next == nil {
  26. return head
  27. }
  28. // initialize before, curr, after
  29. before := &ListNode{0, head}
  30. curr := head
  31. after := curr.Next.Next
  32. // swap node
  33. before.Next = curr.Next
  34. curr.Next.Next = curr
  35. curr.Next = after
  36. // head of result
  37. res := before.Next
  38. for after != nil && after.Next != nil {
  39. // move ptr
  40. before = curr
  41. curr = after
  42. after = after.Next.Next
  43. // swap node
  44. before.Next = curr.Next
  45. curr.Next.Next = curr
  46. curr.Next = after
  47. }
  48. return res
  49. }
  50. func swapPairs(head *ListNode) *ListNode {
  51. dummy := ListNode{0, head}
  52. curr := &dummy
  53. for curr.Next != nil && curr.Next.Next != nil {
  54. first, second := curr.Next, curr.Next.Next
  55. // swap node
  56. first.Next = second.Next
  57. second.Next = first
  58. curr.Next = second
  59. // move forward
  60. curr = curr.Next.Next
  61. }
  62. return dummy.Next
  63. }
  64. func main() {
  65. l15 := ListNode{5, nil}
  66. l14 := ListNode{4, &l15}
  67. l13 := ListNode{3, &l14}
  68. l12 := ListNode{2, &l13}
  69. l1 := &ListNode{1, &l12}
  70. fmt.Println(list2str(swapPairs(l1)))
  71. l22 := ListNode{2, nil}
  72. l2 := &ListNode{1, &l22}
  73. fmt.Println(list2str(swapPairs(l2)))
  74. l33 := ListNode{3, nil}
  75. l32 := ListNode{2, &l33}
  76. l3 := &ListNode{1, &l32}
  77. fmt.Println(list2str(swapPairs(l3)))
  78. fmt.Println(list2str(swapPairs(&ListNode{1, nil})))
  79. }