回文链表
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
题解一:
要判断一个单链表是否为回文链表,可以使用双指针和逆序链表的方法。具体步骤如下:
- 使用快慢指针找到链表的中间节点。
- 将链表的后半部分进行逆序。
- 将链表的前半部分和逆序后的后半部分进行比较,判断是否相等。
代码实现:
class Solution:def isPalindrome(self, head: Optional[ListNode]) -> bool:if not head:return Falseif not head.next:return True# 通过快慢指针找到链表的中间位置slow=headfast=headwhile fast and fast.next:slow=slow.nextfast=fast.next.nextprev=Nonetemp=None# 从中间位置反转后半部分的链表while slow:temp=slow.nextslow.next=prevprev=slowslow=temp# 比较前半部分的链表和后半部分的链表# 记得这里是prev是头节点,slow已经指向了Nonewhile prev:if head.val!=prev.val:return Falsehead=head.nextprev=prev.nextreturn True
这个方法的时间复杂度为 O(n),其中 n 是链表的长度。需要遍历链表一次找到中间节点,并且逆序后半部分链表,然后再次遍历进行比较。空间复杂度为 O(1),因为只使用了有限数量的额外指针。