题目:
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
算法:
链表反转
func isPalindrome(head *ListNode) bool {
fast, slow := head, head
count := 0
for fast != nil {
if fast.Next == nil {
count ++
fast = fast.Next
} else {
count += 2
fast = fast.Next.Next
}
slow = slow.Next
}
// fmt.Println(slow.Val)
var pre *ListNode
cur := head
for cur != slow {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
if count % 2 == 1 {
pre = pre.Next
}
// fmt.Println(count, pre.Val, cur.Val, slow.Val)
for pre != nil {
fmt.Println(pre.Val, slow.Val)
if pre.Val != slow.Val {
return false
}
pre = pre.Next
slow = slow.Next
}
return true
}
更清晰的版本 注意链表节点只有1、2个的情况
func isPalindrome(head *ListNode) bool {
firstHalfStart := head
firstHalfEnd := findFirstHalfEnd(head)
secondHalfStart := revert(firstHalfEnd.Next)
for secondHalfStart != nil{
if firstHalfStart.Val != secondHalfStart.Val {
return false
}
firstHalfStart = firstHalfStart.Next
secondHalfStart = secondHalfStart.Next
}
return true
}
func findFirstHalfEnd(head *ListNode) *ListNode {
fast, slow := head, head
for fast.Next != nil && fast.Next.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
return slow
}
func revert(head *ListNode) *ListNode {
cur := head
var pre *ListNode
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
return pre
}