题目描述
请判断一个链表是否为回文链表。
// 1 2 nil
// 1 2 1 nil
// 1 2 2 1 nil
思路分析
- 快慢指针找到链表中点
- 从中点拆分并反转尾链表
- 依次对比头尾链表值是否相等
代码实现
func isPalindrome(head *ListNode) bool {
if head == nil {
return true
}
fast := head.Next
slow := head
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
tail := reverse(slow.Next)
slow.Next = nil
for head != nil && tail != nil {
if head.Val != tail.Val {
return false
}
head = head.Next
tail = tail.Next
}
return true
}
func reverse(head *ListNode) *ListNode {
if head == nil {
return head
}
var pre *ListNode
for head != nil {
temp := head.Next
head.Next = pre
pre = head
head = temp
}
return pre
}