给你一个单链表的头节点 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