Автор оригинала: FreeCodeCapm Team.
Энтони Силилли
Я всегда понял основную концепцию связанных списков, но я никогда не ставлю его на практику.
Это было не до мою самого первого интервью Amazon лет назад, когда я понял, что понятия не имею, как понятие связанных списков переведена в код.
И именно поэтому я пишу этот гид!
Моя цель – помочь Вы Получите работу в качестве инженера программного обеспечения.
Я хочу покрыть много связанных списков вопросов собеседования, и эта статья является первым шагом в этом процессе. Так что давайте погрузимся в.
Что такое связанный список?
Связанный список – это структура данных, состоит из многих структур мини-данных, называемых узлами. Узлы связывают вместе, чтобы сформировать список.
Каждый узел содержит 2 атрибута
- Его ценность. Это может быть все: целые числа, персонажи, строки, объекты и так далее.
- Указатель на следующий узел в последовательности.
Некоторые определения
«Узел головки»: Главный узел – это просто первый узел в связанном списке. Как мы можем видеть из приведенного выше примера, узел, содержащий «5», является первым узлом, и, следовательно, головой.
«Хвостовой узел»: Хвостовой узел – последний узел в последовательности. Поскольку это последний узел, он указывает на NULL, потому что в последовательности нет следующего узла. В приведенном выше примере узел, содержащий «3», будет хвостовым узлом.
Поощно связано против вдвойне связанного
Когда дело доходит до связанных списков, есть два основных вида.
Те, которые «одиноки» связаны, и те, которые «вдвойне связаны».
Отдельно связан означает, что каждый узел указывает только на большинство 1 другого узла, узел перед ним. Это выставляется в примере выше.
Вдвойне связано означает, что каждый узел может указывать на 2 других узла, узел перед ним и узел за ним. Как мы можем видеть из приведенного ниже примера, поскольку узел отсутствует, предшествующий узлу головного узла (который составляет 5), один из его указателей указывает на нулевые.
Хорошо, я понимаю все это. Но как работает код?
Кодирование связанных списков может быть 4 линейная проблема или проблема 400 линий. Это зависит от того, как вы хотите подойти к нему.
На простейшем уровне, как мы обсуждали, связанный список просто Букет из связанных узлов.
Таким образом, все, что нам действительно нужно создать эту структуру, является объектом узла.
class linkedListNode: def __init__(self, value, nextNode=None): self.value = value self.nextNode = nextNode
Здесь мы можем видеть, что мы просто создали класс, который имеет значение, а также атрибут NextNode.
Чтобы создать узел, мы просто проходим в цене.
node1 = linkedListNode("3") # "3"node2 = linkedListNode("7") # "7"node3 = linkedListNode("10") # "10"
Здесь мы создали 3 отдельных узла.
Следующим шагом просто подключить их вместе.
node1.nextNode = node2 node2.nextNode = node3
Первая строка выше делает Node1 точка на Node2:
“3” → “7”
Вторая строка выше делает Node2 Point на Node3:
“7” → “10”
Все вместе, мы остались со связанным списком, который выглядит так:
«3» → «7» → «10» → Нуль
Примечание: «10» указывает на NULL, потому что Node3 не было назначен NODE3, а NextNode по умолчанию NULL.
Как будто я упоминал ранее, есть много разных способов сделать это. Это просто самый простой.
Если вы пытаетесь сделать весь класс LinkedList, Это видео Глубится, как это сделать.
Пересекающий связанный список
Если вы занимаетесь программированием собеседования, и вам задают вопрос связанного списка, вы не будете получать все узлы.
Все, что вы получите, это главный узел.
Из этого узла головки вы должны получить остаток списка.
Сначала давайте понять, как получить значение и дополнять с узла в Python.
Допустим, у нас есть узел, просто названный «узел».
Получение значения узла:
node.value
Получение NextNode узла:
node.nextNode
Обход
Это первое, что мы хотим сделать, это создать переменную, называемую «Currentnode», которая отслеживает узел, на котором мы находимся. Мы хотим назначить это нашему узлу голова сначала.
currentNode = head
Теперь все, что нам нужно сделать, это просто проверять, будет ли наш текущий узел NULL. Если это не так, мы делаем наш «текущий», равный «NextNode» «CurrentNode».
currentNode = node1while currentNode is not None: currentNode = currentNode.nextNode
Допустим, у нас есть следующий связанный список: «3» → «7» → «10».
Наша голова и первый «текущий» – «3».
Когда мы сделаем
currentNode = currentNode.nextNode
Мы переназначим «текущий» на нашему соседу нашего нынешнего узла, который в этом случае «7».
Это продолжается до тех пор, пока uecentnode не указан ни на что, в этом случае петля останавливается.
И это базовый способ пройти через связанный список в Python.
Ссылка на код на Github.
Вставка элементов
Когда вы вставляете элемент в связанный список, вы вставляете его в обратно, если не указано иное.
Давайте использовать следующий пример:
«3» → «7» → «10» → Нуль
Допустим, мы хотим вставить «4».
Мы просто найдем хвостовой узел в этом случае «10» и установили его NextNode к нашему узлу «4».
«3» → «7» → «10» → «4» → Нуль
node4 = linkedListNode("4")node3.nextNode = node4
Теперь скажем, что мы были в интервью, и все, что у нас было, это был главный узел.
Мы просто проходим через LinkedList, чтобы найти хвост. Как только у нас есть хвост, мы просто устанавливаем его NextNode на наш новый узел, который мы создаем.
def insertNode(head, valuetoInsert): currentNode = head while currentNode is not None: if currentNode.nextNode is None: currentNode.nextNode = linkedListNode(valuetoInsert) return head currentNode = currentNode.nextNode
Удаление элементов
Удаление может получить немного сложно.
Давайте возьмем тот же пример.
«3» → «7» → «10» → Нуль
Если мы хотели удалить «7», все, что нам нужно сделать, это указать «3» на «10», чтобы «7» никогда не ссылается.
“3” → “10” → Нуль
Для этого нам придется пройти список, пока не только отслеживает текущий момент, но и отслеживание предыдущий.
Мы также должны были учитывать узел главы, являющегося узлом, который мы хотим удалить.
В приведенном ниже коде мы просто удаляем первый экземпляр значения, который мы хотим удалить.
Обратите внимание, что есть много способов выполнить это, и решение ниже может быть не самым чистым кодом, который вы увидите в своей жизни. Однако в теплое интервью интервьюер, вероятно, не будет ожидать, что TextBook Perfect Code.
def deleteNode(head, valueToDelete): currentNode = head previousNode = None while currentNode is not None: if currentNode.value == valueToDelete: if previousNode is None: newHead = currentNode.nextNode currentNode.nextNode = None return newHead # Deleted the head previousNode.nextNode = currentNode.nextNode return head previousNode = currentNode currentNode = currentNode.nextNode return head # Value to delete was not found.
В указанном выше коде мы находим узел, который мы хотим удалить, мы устанавливаем «NextNode предыдущего узла» на «NextNode» удаленного узла, чтобы полностью вырезать его из списка.
Большая цеха
** Примечание ** Это временные сложности для структуры узлов выше, что, скорее всего, появится в интервью. В практических случаях вы можете хранить атрибуты в классе LinkedList, чтобы снизить эти сложности.
«n» количество элементов внутри связанного списка.
Вставляя в заднюю часть связанного списка- Мы проходим через все n элементов, чтобы найти хвост и вставить наш новый узел. На)
Вставка в переднюю часть связанного списка – Мы просто создаем новый узел и установите его NextNode к головке. Нет необходимости проходить список. O (1)
Пересекание – Мы проходим через все n элементов один раз. На)
Удаление – Сценарий наихудшего случая, узел, который мы удаляем, – это последний узел, заставляющий нам пройти через весь список. На)
Теперь вы можете справиться со ссылкой на вопросы собеседования!
Теперь у вас есть фундаментальные знания, которые вам нужно начать решать вопросы собеседования списка!
Они могут начать легко, и очень быстро становится жестко.
В следующей статье я собираюсь пойти через пару общих вопросов и техник, которые вы можете использовать для их решения.
Если вы студент, стремясь посадить стажировку своей мечты или полную работу в течение следующих 2 лет, начните практиковать сейчас!
Я начал сообщество ( www.theforge.ca ), где мы связываем студентов с наставниками и экспертами в отрасли, которые помогают им перемещаться по пути к работе своей мечты.
Спасибо за чтение, и удачи!