判断一个链表是否为回文结构【刷题记录】

导读:本篇文章讲解 判断一个链表是否为回文结构【刷题记录】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、题目描述

给定一个链表,请判断该链表是否为回文结构。

示例1
输入:[1]
返回值:true

示例2
输入:[2,1]
返回值:false
说明:2->1

示例3
输入:[1,2,2,1]
返回值:true
说明:1->2->2->1

二、解题思路及代码

(一)利用栈的特性,利用数组存储值进行判断

因为如果链表是回文的,那么将整个链表反转后肯定还是跟原链表是一样的。所以我们就利用栈的先进后出的特性,将整个链表的节点放进栈中,然后进行出栈操作相当于链表反转的作用,再进行依次遍历比较。在这里插入图片描述

class Solution:
    def isPail(self , head ):
        # write code here
        #节点值比较方法
        if not head:
            return True
        stack = []
        cur = head 
        while cur:
            stack.append(cur.val)
            cur = cur.next
        return stack == stack[::-1]

复杂度分析:
时间复杂度:O(n), 循环遍历次数取决于链表的长度。
空间复杂度:O(n),使用了栈,空间大小取决于链表的长度。

(二)利用快慢指针找到中点,分割成两条链,在进行值判断
即分为三个步骤:找中点+反转链表+遍历比较

1、快慢指针找中点 先使用快慢指针找到链表的中点,然后根据中点找到表示后半段链表的头节点。

可以利用快慢指针,快指针一次走两步,慢指针依次走一步,当快指针走到终点的时候,此时如果链表的长度为偶数时,此时中间节点有两个,慢指针则走到了左端点。反之,慢指针则走到中间节点。(第二个链表的长度比第一个链表的长度小1)

2、反转链表
具体已记录在:: 反转链表【刷题记录】.
3、遍历比较

class Solution:
    def isPail(self , head ):
        # write code here
        if head == None or head.next == None:
            return True
        slow = head
        fast = head
        while fast and fast.next:
            pre = slow
            slow = slow.next
            fast = fast.next.next
        ##从中点断开 分成两条链 head and slow
        pre.next = None
        ## 链表反转
        head2 = None
        while slow:
            temp = slow.next
            slow.next = head2
            head2 = slow
            slow = temp
        while head and head2:
            if head.val != head2.val:
                return False
            head = head.next
            head2 = head2.next
        return True

复杂度分析:
时间复杂度:O(n), 循环遍历次数。
空间复杂度:O(1), 没有使用额外的空间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99769.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!