在编程面试中,回文结构是一个常见的主题。其中,回文链表是指一个链表从前往后读和从后往前读完全相同。这个问题不仅考察了算法设计能力,还考验了解决问题的创新思维。接下来,我们将详细探讨如何解决“检查链表是否为回文”这一经典面试题。
给定一个单向链表,编写一个函数判断这个链表是否是一个回文结构。输入是一个带有头节点的链表,输出是一个布尔值表示该链表是否为回文。
head = [1, 2, 3, 2, 1]
True
head = [1, 2, 3, 4, 5]
False
解决此问题的关键在于如何比较链表中的数据,使其能够前后对称。主要可以分为以下几种方法:
通过将链表节点值压入栈中,然后弹出并与链表当前节点的值进行对比。
初始化:
遍历并存入栈:
比较回文性:
False
;否则最终返回 True
。初始化:
找到链表中点:
反转后半部分链表:
逐个对比值:
恢复原状(可选):
反转后半部分重新归位:
返回结果
以下是使用快慢指针方法的 Python 代码实现:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def is_palindrome(head: ListNode) -> bool:
if not head or not head.next:
return True
# Find the middle of the linked list
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# Reverse the second half of the list
prev = None
current = slow
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
# Check if the first and second halves are equal
first_half = head
second_half = prev
is_palindromic = True
while second_half:
if first_half.val != second_half.val:
is_palindromic = False
break
first_half = first_half.next
second_half = second_half.next
# Restore the original linked list (optional)
current = prev
while current and current.next:
next_node = current.next
current.next = prev
prev = current
current = next_node
return is_palindromic
# 示例用法
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(2)
node5 = ListNode(1)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
print(is_palindrome(node1)) # 输出: True
解决回文链表问题的关键在于如何有效地比较链表前后半段的元素,这里我们分别使用了栈和快慢指针反转部分链表的方法。这两种方法各有优缺点,选择哪种取决于具体需求和实现难度考虑。在实际面试中,清晰地阐述你的解题思路以及所选方法的优点是极其重要的。