题目描述:具体描述见原题。简单来说就是判断该链表是否是回文链表。
解题思路:如果是回文链表,那么将链表后半部分反转之后,对应节点值肯定和链表前半部分对应节点值是一致的。所以首先找到链表中间节点,其次反转后半部分链表,最后遍历比较对应节点值。具体过程见代码。
具体代码:
func isPalindrome(head *ListNode) bool {
if head == nil || head.Next == nil {
return true
}
slow, fast := head, head
for fast.Next != nil && fast.Next.Next != nil { // 找到链表中间节点
slow = slow.Next
fast = fast.Next.Next
}
pre, middle := slow.Next, slow
for pre.Next != nil { // 反转链表后半部分
cur := pre.Next
pre.Next = cur.Next
cur.Next = middle.Next
middle.Next = cur
}
pre = slow.Next
for head != middle { // 依次比较对应位置节点值是否相等
if head.Val != pre.Val {
return false
} else {
head = head.Next
pre = pre.Next
}
}
if head == middle { // 注意判断边界情况。比如链表为 “1->2”,这应该是第81个用例,第一遍跑的时候就忽略了这个边界条件...
if pre != nil && head.Val != pre.Val {
return false
}
}
return true
}
补充说明:这又是一道找中点和反转链表相结合的题目,因此可以看出很多不涉及特殊解法的链表题目大部分都涉及之前总结的基础知识点,拿笔画一画是最好的理解方法。