描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路
1. 利用快慢指针 找到链表的中间节点
2. 满指针在遍历的时候将前半部分的链表反转
3. p1 p2 分别指向中间节点开始遍历判断是否相等
1 -> 2 -> 2 -> 1 反转后 1 <- 2 2-> 1 p1=2 p2=2
1 -> 2 -> 0 -> 2 -> 1 反转后 1 <- 2 0->2->1 p1=2 p2 = 2
实现
func isPalindrome(head *ListNode) bool {
if head == nil || head.Next == nil{
return true
}
slow := head
fast := head.Next
var pre *ListNode
var prepre *ListNode
for fast != nil && fast.Next != nil{
prepre = pre
pre = slow
slow = slow.Next
fast = fast.Next.Next
pre.Next = prepre
}
var p1 *ListNode
var p2 *ListNode
if fast == nil{
p2 = slow.Next
p1 = pre
}else{
p2 = slow.Next
p1 = slow
slow.Next = pre
}
for p1 != nil{
if p1.Val != p2.Val{
return false
}
p1 = p1.Next
p2 = p2.Next
}
return true
}