题目
https://leetcode-cn.com/problems/palindrome-linked-list/
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O (n) 时间复杂度和 O (1) 空间复杂度解决此题?
思路
把链表从中间分成两部分,即找到中间节点
对中间节点之后的链表进行反转
前半部分和后半部分反转后的链表进行值的比较
注意:分开前半部分的时候,前半部分的最后一个节点的 next 需要指向 None
时间复杂度:O(n)
空间复杂度:O(1)
测试用例
- 空链表
- 回文链表
- 偶数个:1->2->3->3->2->1
- 奇数个:1->2->3->2->1
- 非回文链表
class Solution: def isPalindrome(self, head: ListNode) -> bool: if not head: return True dummy = ListNode(0) dummy.next = head
# 找到中间节点
low = dummy
fast = dummy
while fast and fast.next:
low = low.next
fast = fast.next.next
mid = low.next
# 对中间节点之后的节点反转
mid = self.reverse(mid)
# 断开前半部分
low.next = None
# 对两个链表进行比较
cur = dummy.next
while mid and cur:
if mid.val != cur.val:
return False
mid = mid.next
cur = cur.next
return True
# 对一个链表进行反转
def reverse(self, head: ListNode) -> ListNode:
if not head:
return None
cur = None
while head:
node = head.next
head.next = cur
cur = head
head = node
return cur
```