234. 回文链表
234. 回文链表
题意
判断链表是否是回文串;
解题思路
将链表中的值加入到数组中,然后比较回文串,但是这有个缺点,就是需要花费数组的空间。
实现
class Solution(object):
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return True
nums = []
while head:
nums.append(head.val)
head = head.next
left, right = 0, len(nums)-1
while left <= right:
if nums[left] != nums[right]:
return False
left += 1
right -= 1
return True
如果是不需要额外的空间,那么可以让链表前半部倒置,让两个指针分别朝着前后两个方向移动,如果不相等则退出。
class Solution(object):
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return True
slow, fast = head, head
rev = None
while fast and fast.next:
fast = fast.next.next
rev, rev.next, slow = slow, rev, slow.next
# 避免奇数时,slow差一个位置,总之形成rev和slow相对应的情况
if fast:
slow = slow.next
while rev:
if rev.val != slow.val:
return False
else:
slow = slow.next
rev = rev.next
return True
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法