Структуры данных в Python #1: Односвязные списки
HTML-код
- Опубликовано: 28 сен 2024
- В этой серии уроков мы будем учиться реализовывать собственные структуры данных в языке python. Начнём со списков и далее по списку, извините за каламбур. На следующем уроке закончим разбирать все остальные виды списков, потому как они все очень похожи.
Оставляйте комментарии и подписывайтесь на канал, чтобы не пропустить новые видео! Приятного просмотра!
Ссылка на статью с хабра: habr.com/ru/po...
Теги:
программирование, IT, python, code, vscode, структуры данных, алгоритмы, как написать списки, односвязный список, САКОД.
Ребят, я в шоке. 13к просмотров на конец январая 2к23го. Спасибо всем огромное и там, ну это... можете другие видосики посмотреть... вот....
лучший! Я пересмотрел видео 10-15 и ток у тебя понял, что да как
советую всем делать сохранение - ложиться спать после изучения информации, затем читаем ещё раз и делаем
работает 10000%
Два дня рою интернет чтобы с 0 понять linked list, наконец-то нашёл нормальный видос, где с 0 он создаётся, заполняется, запускается. А то везде написано как создать, а как заполнить и запустить никто не говорит
Спасибо автору! все понятно объяснил. Жду продолжения серии роликов про структуры данных в Python!
self.length, как атрибут класса, можно было бы использовать и работал бы правильно, если увеличить счетчик в момент добавления головного элемента на 16-ой строке.
Спасибо большое, за такой качественный и полезный ролик!
Спасибо, автор, на пальцах все объяснил!
очень все понятно обьяснил, давай следующий урок!
Вопрос-замечание автору, точнее 2 (сам новичок, поэтому не ругайте, пытаюсь сам разобраться).
1) В методе insert, при вставке в начало списка (когда index == 0), возникает бесконечный цикл. Необходима реализация, где создается новый узел и присваиваете ему next_node ссылку на текущий self.head.
def insert(self, val, index):
i = 0
previous_node = self.head
current_node = self.head
# If inserting at the beginning
if index == 0:
new_node = self.Node(val, next_node = self.head)
self.head = new_node
else:
# Find the correct insertion position
while i < index:
previous_node = current_node
current_node = current_node.next_node
i += 1
previous_node.next_node = self.Node(val, next_node=current_node)
согласны ли?
2) В методе delete, нет необходимости использовать del. Ведь в момент, когда мы переназдначаем ссылку previous_node.next_node = node.next_node удаляемый елемент теряет ссылку на себя и будет автоматически удален сборщиком мусора.
def delete(self, index):
i = 0
current_node = self.head
previous_node = self.head
if index == 0:
self.head = self.head.next_node
else:
while i < index:
previous_node = current_node
current_node = current_node.next_node
i += 1
previous_node.next_node = current_node.next_node
P.S. Автору огромное спасибо за материал! Очень ценю, когда люди тратят свое время чтобы поделиться своим опытом!
Чтобы узнать длину, проще счётчик запихать в класс Node.
Вернее атрибут создать в LinkedList, а плюсовать уже в Node.
Тогда при создании каждой ноды будет +1 и не надо в каждый метод прописывать.
DRY!
А можете, пожалуйста, рассказать, как такое провернуть?🙏
@@kif_chik5911 class LinkedList:
head = None
length = 0
class Node():
element = None
next_node = None
def __init__(self, element, next_node=None):
self.element = element
self.next_node = next_node
LinkedList.length += 1
В конце def delete можно добавить LinkedList.length -= 1
О дааа. прекрасно понимаю уже как лл работает, но решить задачу - испытание))
13:50 Можно было сделать просто while node. Так как node мы каждый раз присваиваем значение следующего узла, то когда мы обработаем последний, в переменной node будет Null.
23:30 в принципе, perv_node нам и не нужен в функции get.
Насчёт length тебя уже поправили.
Ну и для каждой функции нужно обрабатывать исключения. Например у тебя есть список [10, 20, 30], а ты изменяешь, получаешь или удаляешь 4 элемент.
Спасибо тебе большое за видос, все внятно и понятно объяснил.
Успехов тебе!❤️
Го некст видос, про двусвязные списки, очереди и тому подобное!
В ближайшее время запилю на двусвязные и циклические списки.
@@programming_etc а можно прям в ближайшее ближайшее время? А то видео на эту тему нет(на питоне), а мне сдавать лабы уже надо🤣🤣🤣🤣
insert с индексом 0 будет норм работать? там по идее head.next = element, element.next = head будет
бро сп все помогло удачи тебе !!!!!
В def get можно ли убрать prev_node = node? Нам же не обязательно помнить предыдущий, чтобы вывести индекс?
Чел, спасибо.
Может кто подсказать где я недоглядел. На 12:45 в этом фрагменте, когда я запускаю свой код, мне выдает:
"TypeError: Node() takes no arguments"
Мой код:
class LinkedList:
head = None
class Node:
element = None
next_node = None
def __int__(self, element, next_node=None):
self.element = element
self.next_node = next_node
def append(self, element):
if not self.head:
self.head = self.Node(element)
return element
node = self.head
while node.next_node:
node = node.next_node
node.next_node = self.Node(element)
def out(self):
node = self.head
while node.next_node:
print(node.element)
node = node.next_node
print(node.element)
linked_list = LinkedList()
linked_list.append(10)
linked_list.append(15)
linked_list.append(312)
linked_list.append(54)
linked_list.append(1001)
linked_list.out()
Не смею критиковать автора, возможно, у меня что-то вышло не так. При использовании метода insert с параметром index=0, происходит так, что переданный элемент и элемент head просто повторяются бесконечное количество раз, потому что не переопределяется переменная head
def insert(self, index, element):
node = self.head
prev_node = self.head
if index == 0:
self.head = self.Node(element=element, nextNode=prev_node)
return element
for i in range(0, index):
prev_node = node
node = node.nextNode
prev_node.nextNode = self.Node(element=element, nextNode=node)
return element
nice...
Спасибо за видео, яндекс позвонил говорят на hh резюме увидели и пригласили пройти стажировку. Вот сижу делаю заметки так сказать 😂
Поздравляю. На яндексе кстати рил любят гонять по структурам данных и алгоритмам, в частности по деревьям, я знаю много спрашивают.
@@programming_etc я на devops направление, там написано "базовые алгоритмы" так что верю в лучшее но учту)) не планируешь продолжить рубрику?
@@academai11 доброго дня : ) Получилось собеседование пройти в Яндекс? Какие были задачи, вопросы? : )
отлично все. только код пишите заранее. мне совсем неинтересно смотреть ошибки кода и процесс его набивания. а так все супер, продолжайте пжста
Спасибо этому человеку который все понятно объяснил. Хочу увидеть видео про некоторых алгоритмов например Алгоритм дейкстры или алгоритм кадена. Жду не стерпением!
Хороший гайд, поможет студентам, которые начинают изучать структуры и алгоритмы обработки данных
мне так кажется я никогда это не пойму)))
а не, понял
Видео прикольное и полезное! Спасибо автору!
Спасибо большое ты мне очень помог!
"здравствуйте мои маленькие любители видеок...." а... блин
Не выкупил отсылки)
я начал решать задачи на leetcode и не понимал что вообще за структура данных это, хотел сам воспрозвести но не вышло, спасибо за помощь
а можно ссылку на гитхаб?
Спасибо за видео:D
Благодарю за видео!
Спасибо!
Благодарность за урок!
Привет, сделай видео о взломе вайфая через wps или через другие способы очень интересная тема
че так сложно