📅  最后修改于: 2023-12-03 14:54:57.332000             🧑  作者: Mango
单向链表是指链表的每个节点只有一个指针,指向下一个节点。判断一个单向链表是否是回文的,可以使用双指针法和栈来实现。下面我们将介绍两种实现方法。
双指针法是指使用两个指针,一个指向头节点,另一个指向尾节点,然后逐个判断节点的值是否相等。具体实现如下:
def is_palindrome(head):
if not head or not head.next:
return True
# 找到中间节点
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 翻转后半部分链表
prev, cur = None, slow
while cur:
cur.next, prev, cur = prev, cur, cur.next
# 比较前半部分和翻转后的后半部分链表
while prev and head:
if prev.val != head.val:
return False
prev = prev.next
head = head.next
return True
该算法的时间复杂度为 O(n),空间复杂度为 O(1)。
栈是一种后进先出的数据结构,我们可以用栈来保存链表的前半部分节点。具体实现如下:
def is_palindrome(head):
if not head or not head.next:
return True
# 找到中间节点
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 将前半部分节点入栈
stack = []
cur = head
while cur != slow:
stack.append(cur)
cur = cur.next
# 判断链表是否有奇数个节点
if fast:
cur = cur.next
# 比较栈和后半部分链表
while cur:
if stack.pop().val != cur.val:
return False
cur = cur.next
return True
该算法的时间复杂度为 O(n),空间复杂度为 O(n)。