Рубрики
Без рубрики

[Вопрос интервью] Обратный список связан

🏗️ Теги компании: Как сообщает многочисленные программисты по всему миру, этот вопрос был задан в кодировке интервью / раундов компаний, такими как – AmazonaccoliteadobecoCogognizantGoldman Sachsvmware, поэтому, если вы готовитесь к своему предстоящему кодирующему интервью, то вам вполне могут столкнуться с этим вопросом Ваш кодирующий раунд. Можете ли вы решить это? Формулирование проблем с учетом головы … [Вопрос собеседования] Обратный список связанный список Подробнее »

Автор оригинала: Shubham Sayon.

🏗️ Теги компании: Как сообщает многочисленные программисты по всему миру, этот вопрос был задан в кодировании интервью/раундов компаний, как-

  • Амазонка
  • Акколит
  • Амантичный
  • Cisco.
  • Познан
  • Голдман Сакс
  • Vmware.

Итак, если вы готовитесь к вашему предстоящему кодирующему интервью, то вам вполне могут столкнуться на этот вопрос в вашем кодировании. Можете ли вы решить это?

Постановка проблемы

Дано голова отдельно Связанный список обратный список и верните Перевернутый список Отказ

⚠️strants: Количество узлов в списке – это диапазон [0, 5000]

💣 Задача: Можете ли вы реализовать итеративное решение и рекурсивное решение?

💡examples.

Давайте посмотрим на некоторые примеры для улучшения нашего понимания этой проблемы.

Пример 1:

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

Пример 2:

Input: head = [1,2]
Output: [2,1]

Пример 3:

Input: head = []
Output: []

🖊️ Решение 1: итеративный подход

В этом решении вы узнаете, как изменить данный связанный список итеративно Отказ

Подход: Идея состоит в том, чтобы пройти список и изменить следующий указатель текущего узла, чтобы указать на его предыдущий элемент. Узел не имеет ссылки на свой предыдущий узел. Следовательно, вам нужно заранее хранить предыдущий элемент. Вам нужен другой указатель, который хранит следующий узел перед вами.

Проще говоря, вам понадобится три указателя:

  • Current_node → Указывает на текущий узел.
  • Previous_node → Указывает на задний/предыдущий узел к текущему узлу.
  • next_node → Указывает на следующий узел к текущему узлу.

Обратитесь за указатель Current_node на каждом шаге, а затем продвиньте всеми тремя на следующий узел. Наконец, верните новую ссылку на головку в конце.

Давайте посмотрим на код:

def reverse_list(self, head):
    previous_node = None
    current_node = head
    while current_node:
        next_node = current_node.next  
        current_node.next = previous_node  
        previous_node = current_node 
        current_node = next_node  
    head = previous_node
    return head

Объяснение:

Давайте понять код с помощью иллюстрации. Подумайте, что данный список – [1,2,3] Отказ

  • Вы должны начать с инициализации Previous_node и next_node Указатели.
  • Как только указатели были инициализированы, следующий этап является итерацией через весь список и отменить его. Давайте визуализируем то, что происходит в каждой итерации:

1-я итерация

2 итерация

3 итерация

Тестовые случаи:

Весь код для выполнения и проверки тестовых случаев по данному подходу можно найти здесь: Обратный список связан в Python Отказ

Анализ сложности: Предполагая, что длина списка – N , для цикла проходит n итераций. Таким образом, итеративное решение имеет сложность выполнения O (n) Отказ

🖊️ Решение 2: рекурсивный подход

Во втором решении вы узнаете, как решить данную проблему, используя рекурсивный подход.

Подход: Этот подход немного сложнее, чем итеративное решение. Идея вот, начать с Узел (голова) и сдвиньте указатели один за другим, используя функцию рекурсивно. Наконец, когда достигнут базовый чехол, вы должны вернуть новую ссылку на головку в конце.

Алгоритм:

  • Начните с головы узла.
    • Если следующий элемент текущего узла является NULL, верните текущий узел.
    • В противном случае рекурсивно проходит список.
      • Убедитесь, что в каждом вызове функций вы обратитесь к следующему указателю текущего элемента в предыдущий элемент списка. I.E., Node.next а затем снова позвоните в рекурсивную функцию I.e., refort_list (n, узел) Отказ

Давайте посмотрим на код для реализации вышеуказанной концепции.

    def reverse_list(self, node, prev=None):
        if not node:
            return prev
        n = node.next
        node.next = prev
        return self.reverse_list(n, node)

Объяснение:

Давайте понять код с помощью иллюстрации. Подумайте, что данный список – [1,2,3] Отказ Чтобы все было легко понять и понять концепцию, вот графические иллюстрации каждого шага, который возникает в нашем коде.

Следующая диаграмма представляет исходное положение указателей и переменных/ссылок в подключенном списке.

1 раунд

  • Во время первой функции звоните, Узел сделано, чтобы указать на элемент CURRNENT, I.E., [1] , пока N сделано, чтобы указать на следующий элемент, то есть [2] Отказ
  • Следующий указатель на текущий узел затем обращается, указывая на предыдущий элемент как Node.next который является Нет в первом случае.
  • Наконец, функция снова вызывается так, что аргументы, переданные функции, следующие refort_list ([2], [1]) Отказ

Раунд 2

  • Во время второй функции звоните, Узел Очки на [2] Какой нынешний узел теперь, пока N сделан на следующий элемент, то есть [3] Отказ
  • Следующий указатель на текущий узел затем обращается, указывая на предыдущий элемент как Node.next который является [1] в таком случае.
  • Наконец, функция снова вызывается так, что аргументы, переданные функции, следующие refort_list ([3], [2]) Отказ

3 раунда

  • Во время второй функции звоните, Узел Очки на [3] Какой нынешний узел теперь, пока N сделан на следующий элемент, который сейчас становится [Нет] Отказ Это указывает на то, что мы находимся на грани достижения базового случая.
  • Следующий указатель на текущий узел затем обращается, указывая на предыдущий элемент как Node.next который является [2] в таком случае.
  • Наконец, функция снова вызывается так, что аргументы, переданные функции, следующие refort_list ([нет], [3]) Отказ

4 раунда

  • Значение узла сейчас [нет]. Вы, мы достигли базового случая. Таким образом, верните новую ссылку на головку из обратного списка, который предоставляется Ранее в таком случае.

Тестовые случаи: Весь код для выполнения и проверки тестовых случаев по данному подходу можно найти здесь: Обратный связанный список в Python

Анализ сложности: Предположим, что N это длина данного связанного списка. Вышеуказанный подход требует n + 1 Функция вызовов для достижения желаемого вывода. Следовательно, момент сложности этого подхода является O (n + 1) ~ O (n) Отказ

Заключение

Я надеюсь, что вам понравилось этот опрос кодирования. Пожалуйста, оставайся настроенными и Подписаться Для более интересных проблем кодирования.

Рекомендуется: Академия компьютерной науки Finxter

  • Вы хотите быстро освоить самые популярные Python IDE?
  • Этот курс приведет вас от новичка к эксперту в Пычарме в ~ 90 минут.
  • Для любого разработчика программного обеспечения имеет решающее значение для освоения IDE хорошо, писать, тестировать и отлаживать высококачественный код с небольшим усилием.

Присоединяйтесь к Pycharm MasterClass Сейчас и мастер Pycharm на завтра!

Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.

Вы можете связаться со мной @: