边工作边刷题:70天一遍leetcode: day 61-1

本文介绍了一种用于判断单链表是否为回文结构的算法实现。该方法通过找到链表的中点,反转后半部分链表,然后从前半部分和反转后的后半部分同时遍历进行比较来实现。文章还详细解释了算法中的关键步骤及注意事项。

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

Palindrome Linked List

要点:暴力解,找到中点,然后reverse后半段,再从两边向中间比较。
错误点:

  • reverse中pre初始为None而不是slow:因为有可能odd或者even,所以从两边向中间可能left.next==right或者left==right。第一种情况要继续判断left和right而第二种不用。为了统一以简化,right的最后为null而不是连到中点。这样可以以right作为条件。slow的位置可能是中点(odd)或者左边最后(even)。也就是和右边相比相同或者多1。所以right先遍历完。
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head or not head.next: return True
        fast = slow = head
        while fast.next:
            fast=fast.next
            if fast.next:
                fast=fast.next
                slow=slow.next
                
        # reverse
        cur = slow.next
        pre = None
        while cur:
            next = cur.next
            cur.next = pre
            pre = cur
            cur = next
        
        while pre:
            if head.val != pre.val:
                return False
            head = head.next
            pre = pre.next
        return True

转载于:https://www.cnblogs.com/absolute/p/5690334.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值