leetcode234(判断回文)

本文介绍了一种用于检测链表是否为回文结构的高效算法。通过将链表的后半部分反转并与前半部分进行比较,可以快速确定链表是否关于中间点对称。该方法适用于单链表,并在O(n)时间内完成检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
    # 前半部分和record list一样
        if not head or not head.next:
            return True
        slow = head
        fast = head.next
        while fast.next and fast.next.next:
            fast = fast.next.next
            slow = slow.next
        slow = slow.next
        if fast.next:
            fast = fast.next
           
        pre = ListNode(-1)
        pre.next = slow
        cur = slow
        nex = slow.next
        while nex:
            cur.next = nex.next
            nex.next = pre.next
            pre.next = nex
            nex = cur.next
     # 举例:1 2 3 4 5 经过上述操作,slow = 3,fast = 5且fast为头指针的链表为 5->4->3,以head为头指针的链表仍为 1 2 3 4 5
        while head != fast:   # 注意这里为判断结点相等,所以需要val和next都相等
            if head.next == fast:  # 结束循环的条件之一(当链表个数为偶数个时适用)解释见下
                return head.val == fast.val 
            elif head.val != fast.val:
                return False
            else:                # 承接第一个if,如1 2  2 1 fast:1 2 ,第一次循环head走到第一个1,fast走到1,进入else
                fast = fast.next  # 此时head为2  fast为2,下一轮循环时,如果没有第一个if,head会为第二个2,fast为None
                head = head.next  # 此时又满足循环条件,继续新一轮,但是此时fast已经为None没有next报错。所以加第一个if
        return True
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的喵喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值