力扣之链表9—回文链表

请判断一个链表是否为回文链表。
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

方法1

将链表元素存入列表后判断
但其时间复杂度和空间复杂度为O(n)

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        if not head:
            return True
        ls=[]
        cur=head
        while cur:
            ls.append(cur.val)
            cur=cur.next
        return ls == ls[::-1]
方法2

利用快慢指针的方法,快指针移动速度是慢指针的2倍,当快指针移动到尾结点时,慢指针指向链表的中点,将链表的后半部分利用递归的方法反转后和前半部分进行比较

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        if not head or not head.next:
            return True
        slow = head
        fast = head
        q = slow
        while fast and fast.next:
            slow = slow.next
            fast =fast.next.next
        revers_list = self.reverse_list(slow)
        while revers_list:
            if revers_list.val != q.val:
                return False
            revers_list = revers_list.next
            q = q.next
        return True
    #反转后边的数
    def reverse_list(self,head):
        if not head.next:
            return head
        last_head = self.reverse_list(head.next)
        head.next.next = head
        head.next = None
        return last_head

你可能感兴趣的:(算法与数据结构,链表,指针,数据结构)