LeetCode 234. 回文链表

1、题目

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

2、解答

这道题其实要想清楚如何判断是否回文。有两种思路,一种就是从首尾两端一一对比;一种是找到中间位置,然后比较前后两部分。

  • 前后指针法:就是把链表转换成数组,然后比较数组是否回文。
  • 栈空间法:这个也是思路一的实现,只不过借用了栈。
  • 递归法:这个算比较巧妙吧,递归找到链表结尾,然后根据递归的特性,反过来遍历这个链表。
  • 快慢指针法:前面三个是思路一的实现,这种事思路二的实现。维护快慢两个指针,然后找到中间位置,再翻转后半指针,和前半部分比较。这种思路空间复杂度是O(1)。
class Solution(object):
    def isPalindrome(self, head):
        """
        双指针法:就是从这个链表首尾两端开始遍历,依次比较左右两个指针值是否相等即可
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True

        node_values = []
        while head is not None:
            node_values.append(head.val)
            head = head.next
        left = 0
        right = len(node_values) - 1
        while left <= right:
            if node_values[left] != node_values[right]:
                return False
            left += 1
            right -= 1
        return True

    def isPalindrome2(self, head):
        """
        栈:这个和双指针其实类似,就是借助了栈这个数据结构
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True
        node_stack = []
        temp = head
        while temp is not None:
            node_stack.append(temp.val)
            temp = temp.next
        while len(node_stack)>0:
            if node_stack.pop(0)!=head.val:
                return False
            head = head.next
        return True


    def isPalindrome3(self, head):
        """
        递归法:这个方法其实也是先递归到链表最底部再和首部比较
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True
        self.gobal = head

        return self.back_trace(head.next)


    def back_trace(self, head):
        if head is None:
            return True

        if self.back_trace(head.next):
            if self.gobal.val==head.val:
                self.gobal = self.gobal.next
                return True
        return False

    def isPalindrome4(self, head):
        """
        快慢指针法:这个是先找到中间点再比较
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True

        fast = low = head
        while fast.next is not None and fast.next.next is not None:
            fast = fast.next.next
            low = low.next
        # 这步操作是用来移动到整个链表的后面部分再翻转
        low = low.next
        reversal_next = self.reversal_node(low)
        while reversal_next is not None:
            if reversal_next.val!=head.val:
                return False
            reversal_next = reversal_next.next
            head = head.next
        return True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值