Палиндром — это последовательность символов, которая одинаково читается как в прямом, так и в обратном направлении. Когда дело доходит до определения того, является ли связанный список палиндромом или нет, мы можем использовать несколько подходов. В этой статье мы рассмотрим несколько методов с примерами кода, чтобы проверить, является ли связанный список палиндромом.
Метод 1: перевернуть и сравнить
Один из самых простых методов — перевернуть связанный список и сравнить его с исходным списком. Если они совпадают, список представляет собой палиндром. Вот пример реализации на Python:
class Node:
def __init__(self, data):
self.data = data
self.next = None
def is_palindrome(head):
reversed_list = reverse_list(head)
return is_equal(head, reversed_list)
def reverse_list(head):
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
def is_equal(list1, list2):
while list1 and list2:
if list1.data != list2.data:
return False
list1 = list1.next
list2 = list2.next
return list1 is None and list2 is None
Метод 2: стек
Другой подход — использовать стек для хранения половины элементов связанного списка. Затем мы можем сравнить оставшиеся элементы с извлеченными элементами из стека. Если они совпадают, список представляет собой палиндром. Вот пример реализации на Python:
def is_palindrome(head):
fast = slow = head
stack = []
while fast and fast.next:
stack.append(slow.data)
slow = slow.next
fast = fast.next.next
# For odd-length lists, skip the middle element
if fast:
slow = slow.next
while slow:
if slow.data != stack.pop():
return False
slow = slow.next
return True
Метод 3: рекурсивный подход
Мы также можем решить эту проблему, используя рекурсивный подход. Идея состоит в том, чтобы использовать два указателя: один для рекурсивного перемещения по списку, а другой для сравнения текущего узла с соответствующим узлом с конца. Вот пример реализации на Python:
class Result:
def __init__(self, node, is_palindrome):
self.node = node
self.is_palindrome = is_palindrome
def is_palindrome(head):
length = get_length(head)
return is_palindrome_helper(head, length).is_palindrome
def is_palindrome_helper(node, length):
if length == 0 or node is None:
return Result(node, True)
if length == 1:
return Result(node.next, True)
result = is_palindrome_helper(node.next, length - 2)
if not result.is_palindrome or result.node is None:
return result
result.is_palindrome = node.data == result.node.data
result.node = result.node.next
return result
def get_length(head):
length = 0
current = head
while current:
length += 1
current = current.next
return length
В этой статье мы рассмотрели три различных метода проверки того, является ли связанный список палиндромом или нет. Мы рассмотрели метод обратного и сравнения, подход на основе стека и рекурсивное решение. Каждый метод имеет свои преимущества и особенности, поэтому важно выбрать наиболее подходящий, исходя из конкретных требований вашего приложения.
Не забудьте проанализировать временную и пространственную сложность каждого метода, чтобы обеспечить оптимальную производительность. Используя эти методы, вы можете с уверенностью определить, является ли связанный список палиндромом в ваших усилиях по программированию.