Связанный Список В Python: Кошки В Коробках

И снова здравствуйте! В ожидании начала курса «Разработчик Python» Мы подготовили для вас небольшой оригинальный материал о связанных списках в Python.

Связанный список в Python: кошки в коробках

Python — очень удобный и универсальный язык, но по умолчанию в нем нет такой структуры данных, как связанный список или LinkedList. Сегодня я поделюсь своей работой на эту тему и немного расскажу о том, что представляет собой эта структура данных.

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



Что такое LinkedList?

LinkedList или связанный список — это структура данных.

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

Каждый элемент такого списка считается узлом.

Фактически узел содержит свое значение, а также две ссылки — на предыдущий и на последующие узлы.

То есть список «связан» узлами, которые помогают перемещаться по списку вверх или вниз.

Благодаря этим структурным особенностям связанный список может быть организован в виде стека, очереди или двойной очереди.

Давайте визуализируем сухие определения.

Теперь у нас есть кошки, которые сидят в коробках.

И на каждой коробочке написано, в каком порядке она находится и что она должна обозначать.



Связанный список в Python: кошки в коробках

Что мы будем делать со связанным списком:
Проверьте, содержит ли он тот или иной элемент; Добавьте узлы в конец; Получить значение узла по индексу; Удалить узлы.

На самом деле вариантов работы с ними гораздо больше, но мы сосредоточимся на реализации этих основных шагов.

Как только вы поймете принцип, по которому они построены, вы сможете легко реализовать свои собственные методы.

Вам придется начать с создания двух классов:

  
  
  
  
   

class Box: def __init__ (self,cat = None): self.cat = cat self.nextcat = None class LinkedList: def __init__(self): self.head = None

В общем, у нас есть узел, внутри которого есть какое-то значение — кот, и ссылка на следующий узел.

То есть в классе Box соответственно есть кот и ссылка на следующий ящик.

Как и любой список, связанный список также имеет начало, а именно заголовок.

Поскольку изначально там ничего нет, для начального элемента установлено значение None.

Содержится ли элемент в списке



Связанный список в Python: кошки в коробках

Начнем с чего-то простого.

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



def contains (self, cat): lastbox = self.head while (lastbox): if cat == lastbox.cat: return True else: lastbox = lastbox.nextcat return False



Добавить узел в конец списка



Связанный список в Python: кошки в коробках

Для начала вам нужно создать новый ящик и поместить в него нового кота.

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



def addToEnd(self, newcat): newbox = Box(newcat) if self.head is None: self.head = newbox return lastbox = self.head while (lastbox.nextcat): lastbox = lastbox.nextcat lastbox.nextcat = newbox



Получить узел по индексу



Связанный список в Python: кошки в коробках

С помощью индекса catIndex мы хотим получить бокс-узел, но так как индекса как такового у узлов нет, то нужно придумать какую-то замену, а именно переменную, которая будет выполнять роль индекса.

Эта переменная — boxIndex. Проходим по всему списку и проверяем «порядковый номер» узла и, если он соответствует требуемому индексу, выдаем результат.

def get(self, catIndex): lastbox = self.head boxIndex = 0 while boxIndex <= catIndex: if boxIndex == catIndex: return lastbox.cat boxIndex = boxIndex + 1 lastbox = lastbox.nextcat



Удалить узел



Связанный список в Python: кошки в коробках

Здесь мы рассмотрим удаление элемента не по индексу, а по значению, чтобы добавить хоть какое-то разнообразие.

Поиск начинается с начала списка, то есть с первого ящика, и продолжается до тех пор, пока ящиков не останется, то есть пока headcat не станет None. Мы проверяем, соответствует ли значение, хранящееся в текущем узле, тому, которое мы хотим удалить.

Если нет, то мы просто идем дальше.

Однако, если он совпадает, мы удаляем его и «перепривязываем» связи, то есть удаляем N-й блок, при этом блок N-1 теперь связывается с блоком N+1.

def removeBox(self,rmcat): headcat = self.head if headcat is not None: if headcat.cat==rmcat: self.head = headcat.nextcat headcat = None return while headcat is not None: if headcat.cat==rmcat: break lastcat = headcat headcat = headcat.nextcat if headcat == None: return lastcat.nextcat = headcat.nextcat headcat = None

На этом все, спасибо за прочтение материала! На самом деле структура LinkedList несложная, и важно понимать, как она работает изнутри.

Конечно, в Python это можно было бы реализовать в лямбда-выражениях, места это заняло бы гораздо меньше, но здесь я стремился как можно подробнее объяснить его структуру и принцип работы в Python, а не гнаться за оптимизацией.

Исходный код доступен посмотреть здесь .

Теги: #python #программирование #linkedlist

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.