力扣回文链表

1.要求

请判断一个链表是否为回文链表。
示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

2.思想及代码

思想:本来想再用一个其他的字符串(或者链表)分别将其中的元素储存起来反转后再遍历比较一遍,但是它要求的是O(1)的空间复杂度。所以利用快慢指针找到中间位置。然后再将其后半部分倒序,最后再比较它倒序后的后半部分链表和前半部分的链表,如果不同就不是回文链表,反之为回文链表

class Solution:
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        #快  慢指针
        if head==None or head.next==None  :
            return True
        fast=head
        low=head
        while fast and fast.next:
            low=low.next
            fast=fast.next.next
        #反转链表后半段
        low=self.reverseList(low)
        while low:
            if head.val!=low.val:
                return False
            head=head.next
            low=low.next
        return True
        
    def reverseList(self, head):
        cur1,pre1=head,None
        while cur1!=None:
            cur1.next,pre1,cur1=pre1,cur1,cur1.next       
        return pre1
        

3.问题

在使用*(1) while head:head=head.next 和(2)while head.next:head=head.next时候要清楚此时到底指向的哪一个节点。和最后会遍历到哪个节点结束。比如[1],(1)当前节点有,为真执行下面的语句,但是(2)就不会执行下边的语句。
[1,2],(1)最终head指向None,但是(2)的head 指向2这个节点.。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值