234.回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。

 示例 1:
输入:head = [1,2,2,1]
输出:true
 示例 2:
输入:head = [1,2]
输出:false

解题思路

  1. 首先用快慢指针,找到中间节点
  2. 以中间节点为头节点的链表,反转
  3. 对比两链表是否相等
  4. 注意链表数为奇数的情况
func isPalindrome(head *ListNode) bool {
     var fast, slow = head, head
     for fast != nil && fast.Next != nil {
         fast = fast.Next.Next
         slow = slow.Next
     }
     rev := reverse(slow)
     for rev != nil {
         if head.Val != rev.Val { // 注意比较的是值
             return false
         }
         rev = rev.Next
         head = head.Next
     }
     return true

}

func reverse(head *ListNode) *ListNode{
     
     var prev *ListNode
     var curr = head
     for curr != nil {
         temp := curr.Next // 注意
         curr.Next = prev
         prev = curr
         curr = temp  // 注意
     }
     
     return prev // 注意
}