image.png
回文数据的特定就是左右两边数据一般是相等的

双指针

将链表转换成数组,然后左右数组值进行比较

  1. package main
  2. import "fmt"
  3. type ListNode struct {
  4. Val int
  5. Next *ListNode
  6. }
  7. func isPalindrome(head *ListNode) bool {
  8. if head==nil {
  9. return true
  10. }
  11. var list []*ListNode
  12. for head!= nil{
  13. list = append(list,head)
  14. head = head.Next
  15. }
  16. i,j:= 0,len(list)-1
  17. for i<j{
  18. if list[i].Val!=list[j].Val {
  19. return false
  20. }
  21. i++
  22. j--
  23. }
  24. return true
  25. }
  26. func main() {
  27. a :=&ListNode{
  28. Val: 1,
  29. }
  30. b :=&ListNode{
  31. Val: 2,
  32. }
  33. a.Next = b
  34. fmt.Println(isPalindrome(a))
  35. a1 :=&ListNode{
  36. Val: 1,
  37. }
  38. b1 :=&ListNode{
  39. Val: 2,
  40. }
  41. a1.Next = b1
  42. c1 :=&ListNode{
  43. Val: 2,
  44. }
  45. b1.Next = c1
  46. d2 :=&ListNode{
  47. Val: 1,
  48. }
  49. c1.Next = d2
  50. fmt.Println(isPalindrome(a1))
  51. }

image.png

反转链表,双指针

快慢指针移动获取中间节点 然后进行比较

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type ListNode struct {
  6. Val int
  7. Next *ListNode
  8. }
  9. func isPalindrome(head *ListNode) bool {
  10. if head==nil {
  11. return true
  12. }
  13. var list []*ListNode
  14. for head!= nil{
  15. list = append(list,head)
  16. head = head.Next
  17. }
  18. i,j:= 0,len(list)-1
  19. for i<j{
  20. if list[i].Val!=list[j].Val {
  21. return false
  22. }
  23. i++
  24. j--
  25. }
  26. return true
  27. }
  28. func isPalindrome1(head *ListNode) bool {
  29. if head==nil {
  30. return true
  31. }
  32. mid := findMid(head)
  33. rev := revertNode(mid)
  34. for head!=nil&&rev!= nil{
  35. if head.Val!= rev.Val {
  36. return false
  37. }
  38. head= head.Next
  39. rev = rev.Next
  40. }
  41. return true
  42. }
  43. func findMid(head *ListNode)*ListNode{
  44. low,fast := head,head
  45. for fast!= nil&&fast.Next!=nil{
  46. low = low.Next
  47. fast = fast.Next.Next
  48. }
  49. return low
  50. }
  51. func revertNode1(head *ListNode)*ListNode{
  52. var pre *ListNode
  53. curr := head
  54. for curr!= nil{
  55. pre,curr,curr.Next = curr,curr.Next,pre
  56. }
  57. return pre
  58. }
  59. func revertNode(head *ListNode)*ListNode{
  60. var pre *ListNode
  61. curr := head
  62. for curr!= nil{
  63. next := curr.Next
  64. curr.Next = pre
  65. pre = curr
  66. curr = next
  67. //pre,curr,curr.Next = curr,curr.Next,pre
  68. }
  69. return pre
  70. }
  71. func main() {
  72. a :=&ListNode{
  73. Val: 1,
  74. }
  75. b :=&ListNode{
  76. Val: 2,
  77. }
  78. a.Next = b
  79. fmt.Println(isPalindrome1(a))
  80. a1 :=&ListNode{
  81. Val: 1,
  82. }
  83. b1 :=&ListNode{
  84. Val: 2,
  85. }
  86. a1.Next = b1
  87. c1 :=&ListNode{
  88. Val: 2,
  89. }
  90. b1.Next = c1
  91. d2 :=&ListNode{
  92. Val: 1,
  93. }
  94. c1.Next = d2
  95. fmt.Println(isPalindrome1(a1))
  96. }