持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
一、题目描述:
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
- 链表中节点数目在范围[1, 10^5] 内
- 0 <= Node.val <= 9
进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
二、思路分析:
和数组的回文判定不同,链表无法直接用切片指针遍历,因此需要:
- 找到链表的中点
- 将中点后的链表翻转
- 比较两段链表,进行回文判定
- 最好再将被反转的链表恢复,这样才是工程中的做法
- 特别注意:在被该函数调用时,该链表不能被其他线程调用
三、AC 代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if not head: #考虑特别情况
return False
if not head.next:
return True
fast=head
slow=head
while True: #快慢指针找到链表的中点
if fast and fast.next:
fast=fast.next.next
slow=slow.next
else:
break
mid=slow
def reverse_linklist(head): #中点后的链表翻转
l=head
dummy_node=None
while head:
tmp=head.next
head.next=dummy_node
dummy_node=head
head=tmp
return dummy_node
right=reverse_linklist(mid)
left=head
while left!=right and left and right: #比较前后两段链表,实现回文判定
if left.val!=right.val:
return False
left=left.next
right=right.next
return True
参考
234. Palindrome Linked List 快慢指针翻转 - 回文链表 - 力扣(LeetCode)
思路1: 判断是否是回文链表,如果逆序返回元素和正序返回元素的值相等,则说明是回文链表,否则不是。 - 回文链表 - 力扣(LeetCode)