因为回⽂串是对称的, 所以正着读和倒着读应该是⼀样的, 这⼀特点是解决回⽂串问题的关键.
这道题的关键在于, 单链表⽆法倒着遍历, ⽆法使⽤双指针技巧。 那么最简单的办法就是, 把原始链表反转存⼊⼀条新的链表, 然后⽐较这两条链表是否相同。
1、 先通过「双指针技巧」 中的快慢指针来找到链表的中点:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# slow
2、从slow开始反转后面的链表,现在就可以开始比较回文串了:
def reverse(head):
pre = None
curr = head
while curr:
nex = curr.next
curr.next = pre
pre = curr
curr = nex
return pre
left = head
right = reverse(slow)
while right:
if left.val != right.val:
return False
left = left.next
right = right.next
return True
总结:
首先,寻找回文串是从中间向两端扩展,判断回文串是从两端向中间收缩。对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表。
具体到回文链表的判断问题,由于回文的特殊性,可以不完全反转链表,而是仅仅反转部分链表,将空间复杂度降到 O(1)。