func IsPalindrome(head *StrNode) bool {
vals := []string{}
for ; head != nil; head = head.next {
vals = append(vals, head.str)
}
n := len(vals)
for i, v := range vals[:n/2] {
if v != vals[n-1-i] {
return false
}
}
return true
}
func endOfFirstHalf(head *StrNode) *StrNode {
fast := head
slow := head
for fast.next != nil && fast.next.next != nil {
fast = fast.next.next
slow = slow.next
}
fmt.Println(slow)
return slow
}
func reverseList(head *StrNode)*StrNode {
var prev,cur *StrNode = nil,head
for cur != nil{
nextTmp := cur.next
cur.next = prev
prev = cur
cur = nextTmp
}
return prev
}
func IsPalindrome01(head *StrNode)bool {
if head == nil || head.next == nil{
return true
}
firstHalfEnd := endOfFirstHalf(head)
secondHalfStart := reverseList(firstHalfEnd.next)
p1 := head
p2 := secondHalfStart
result := true
for result && p2 != nil{
if p1.str != p2.str{
result = false
}
p1 = p1.next
p2 = p2.next
}
firstHalfEnd.next = reverseList(secondHalfStart)
return result
}