234. 回文链表

题目描述

思路
想要判断一个单链表是否是回文链表其实很简单,我们只需要将其以中间节点为界限分为两部分,翻转后面一部分,再从头开始比对两个链表的值Val是否相同,如果完全相同那么就是回文链表,否则就不是回文链表。
为了实现这个目标,我们需要借助两个思想,分别是判断"环状链表"时用到的"快慢指针"以及链表翻转的模版。
首先我们使用快慢指针找到链表的中间位置,即快指针为nil时慢指针指向的节点;然后,我们翻转慢指针到尾部这一段链表;最后,我们从头开始比对这两段链表,如果值完全相同则最后返回true;否则,中途返回false即可。
基于以上思路,我们写代码来解决这道题。
Golang 题解
go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head, tail *ListNode) *ListNode {
curr, prev := head, tail
for curr != tail {
next := curr.Next
curr.Next = prev
prev = curr
curr = next
}
return prev
}
func isPalindrome(head *ListNode) bool {
slow, fast := head, head
for fast != nil {
slow = slow.Next
fast = fast.Next
if fast != nil {
fast = fast.Next
}
}
slow, fast = reverseList(slow, nil), head
for slow != nil {
if slow.Val != fast.Val {
return false
}
slow, fast = slow.Next, fast.Next
}
return true
}