234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表

。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

思路:判断回文的题目我们接触过很多了,不过之前都是字符串、数组啥的,这里是链表,相对会麻烦一些,但核心思想是不变的,就是前后两半部分判断是否相同。

那链表,首先我们遍历一遍,得到这个链表的总长度;然后不能立刻就开始比较了,链表是单向的,找到链表的中间之后,前半部分应该是往前,后半部分直接next往后没问题,因此我们还要多做一个步骤,对前半部分链表进行反转,反转结束后,pre就指向前半部分的第一个节点,cur指向后半部分的第一个节点,判断pre和cur所指向的值是否相同即可,不同则返回false,注意,链表的长度可能是个奇数,如1→0→1,他也是个回文链表,但上面这样pre指向第一个1,cur指向0,直接返回false了,因此需要特殊处理一下,当链表长度为奇数时,cur往后走一步,跳过这个中间节点,继续判断。

代码(Python):

class Solution(object):
    def isPalindrome(self, head):
        length = 0
        cur = head
        while cur != None:             #求出链表的长度
            cur = cur.next
            length += 1
        index = 1
        pre = None
        cur = head
        while index <= length/2:       #反转前半部分链表
            index += 1
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
        if length %2==1:               #若链表长度为奇数,中间的数跳过,不用比较
            cur = cur.next
        while cur != None and pre != None:   #比较前半部分和后半部分是否相同
            if cur.val == pre.val:
                cur = cur.next
                pre = pre.next
            else:
                return False
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值