234.回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
解题思路
- 首先用快慢指针,找到中间节点
- 以中间节点为头节点的链表,反转
- 对比两链表是否相等
- 注意链表数为奇数的情况
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 // 注意
}