题目难度: 简单
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
# 把右半部分翻转后再双指针依次比较, 最后将输入链表结构恢复成原样
# 第一步: 使用快慢指针找中点
fast = head
slow = head
while fast:
fast = fast.next
if fast:
fast = fast.next
slow = slow.next
# 此时slow就是右半部分的头节点(左半部分长度可能相等或多1, 对应总长度是偶数和奇数的情况)
# 第二步: 定义翻转函数, 将右半部分进行翻转
def reverse(cur):
# 翻转并返回新的头
pre = None
while cur:
nex = cur.next
cur.next = pre
pre, cur = cur, nex
return pre
# 第三步: 双指针依次比较左右两部分对应节点, 并记录右半部分末尾节点用于恢复原始结构
left, right = head, reverse(slow)
rightHead = right
res = True
# 注意右半部分长度<=左半部分, 所以一定是right先没
while right:
if left.val != right.val:
res = False
break
left = left.next
right = right.next
# 翻转右半部分开头恢复原始链表结构(注意它可能不存在, 如果当原始链表长度小于等于1时)
reverse(rightHead)
return res
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~