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
posted @ 2017-09-11 20:36  banananana  阅读(88)  评论(0编辑  收藏  举报