LeetCode234. 回文链表Golang版
1. 问题描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
2. 思路
- 利用快慢指针,找到链表中间位置。
- 将链表后半段反转。
- 进行回文数的比较。
3. 代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func isPalindrome(head *ListNode) bool {
if head == nil {
return true
}
firstEnd := endOfFirstHalfList(head)
reverseHead := reverseList(firstEnd.Next)
p1 := head
p2 := reverseHead
for p2 != nil {
if p1.Val != p2.Val {
return false
}
p1 = p1.Next
p2 = p2.Next
}
firstEnd.Next = reverseList(firstEnd.Next)
return true
}
func endOfFirstHalfList(head *ListNode) *ListNode {
slow := head
fast := head
for fast.Next != nil && fast.Next.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
return slow
}
func reverseList(head *ListNode) *ListNode {
prev := &ListNode{}
current := &ListNode{}
prev = nil
current = head
for current != nil {
temp := current.Next
current.Next = prev
prev = current
current = temp
}
return prev
}