题解 | #判断一个链表是否为回文结构#

判断一个链表是否为回文结构

http://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f

更多题解,请关注公众号:程序员学长,让你进大厂不走弯路

判断一个链表是否为回文结构

问题描述

LeetCode 剑指 Offer II 027. 回文链表

给定一个链表,请判断该链表是否为回文结构。回文是指该字符串正序逆序完全一致。

示例:

输入:{1,2,2,1}

输出:true

说明:1 -> 2 -> 2 -> 1

分析问题

回文串是指正读反读都一样的字符串,最简单的是使用双指针法。但是对于链表这种数据结构来说,指针只能向一个方向移动,也就是说只能找到后继节点,没办法找到前驱节点。所以没办法使用双指针法,要想使用双指针,我们就需要把链表元素放入一个数组中,然后再去判断是否是回文,这需要O(n)的空间复杂度,这里就不在赘述。大家可以去看第44题。

我们可以这么考虑,将链表的后半部分进行反转,然后将前半部分和后半部分进行比较,如果相同就代表是回文链表,否则不是回文链表。寻找链表的中点我们可以使用快慢指针的方式。

  1. 快慢指针寻找链表中点。

image-20211015135205230

  1. 对链表的后半部分进行翻转

image-20211015135248963

  1. 前半部分和后半部分进行比较。

image-20211015135313963

class Solution:
    def isPalindrome(self, head) -> bool:
        #链表为空,直接返回true
        if head is None:
            return True

        #找到链表的中点
        middle_point = self.middle_point(head)
        second_start = self.reverse_list(middle_point.next)

        #判断前半部分和后半部分是否相等
        result = True
        first = head
        second = second_start
        while result and second is not None:
            if first.val != second.val:
                result = False
            first = first.next
            second = second.next

        #还原链表并返回结果
        middle_point.next = self.reverse_list(second_start)
        return result

    #快慢指针寻找中点
    def middle_point(self, head):
        fast = head
        slow = head
        while fast.next is not None and fast.next.next is not None:
            fast = fast.next.next
            slow = slow.next
        return slow

    #翻转链表
    def reverse_list(self, head):
        previous = None
        current = head
        while current is not None:
            next_node = current.next
            current.next = previous
            previous = current
            current = next_node
        return previous
全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务