Автор оригинала: 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, узел)
Отказ
- Убедитесь, что в каждом вызове функций вы обратитесь к следующему указателю текущего элемента в предыдущий элемент списка. I.E.,
Давайте посмотрим на код для реализации вышеуказанной концепции.
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.
Вы можете связаться со мной @: