Обучающий курс: stepik.org/a/134212 Инфо-сайт: proproprogs.ru/structure_data Что такое односвязный список. Структура односвязного списка. Основные операции: добавление и удаление элементов, произвольный доступ к элементам.
Лучше чем эти уроки, я не видел! Но неплохо бы было пояснить, как перебрать элементы до того элемента, после которого планируется вставка еще одного... while node?
Смотрю это видео и двухсвязный список потому что прохожу ООП и оооочень тяжко доходит, путаница не много получается. Думаю что возьму курс по структурам данных, но хотелось бы чтобы в видео было применение в коде потому что не очень понятно (точнее совсем не понятно) как этим пользоваться, я понимаю что курс для с++ и питонистов поэтому кода нет и это очень печально что нет примеров в коде
Уточните, пожалуйста, а почему добавление в конец это не O(n)? Мы же должны вначале последовательно дойти до текущего конечного элемента, чтобы поменять у него ссылку. Точно так же как проходим до предпоследнего когда удаляем с конца
мы когда добавляем, то на последний элемент есть указатель tail, поэтому новый элемент ptr просто цепляется к нему, то есть: tail.next = ptr ptr.prev = tail tail = ptr и все
@@selfedu_rus спасибо, вопрос возник в связи с тем, что в языке скала list это односвязный список, но при этом в документации написано что добавление в конец занимает O(n). Скорее всего, потому что tail там ссылается не на последний элемент, а на список всех кроме первого. docs.scala-lang.org/overviews/collections/performance-characteristics.html
Немного не понятно, как реализовать этот список с начального состояния. То есть сначала у нас нет объектов, и head, tail node равный None. Потом мы создаем первый объект, на который указывает все 3 переменные. Дальше мы создаем второй объект, на который теперь указывает tail и node, потом третий также, четвертый и т.д. Я правильно понял?
Почему говориться что в конец односвязного списка вставка О(1) ? Просто как я понял , чтобы присвоить предпоследний элемент в тейл, нам нужно будет этот предпоследний элемент найти, итерируя список с головы. так как привиос метки у нас нет.
@@selfedu_rus ну, допустим. У нас есть сингл лл. У него есть тейл. У тейла есть поле некст привиос нету как в длл. Чтобы удалить тейл нам сначала же надо найти превиос. Тоесть элемент который стоит перед тейлом который и будет после удаления новым тейлом. Чтобы его найти нам надо по некстам нодов про итерировать с головы. Я об этом. Как бы удаление будет (1) но под капотом удаления ещё и итерация, а это уже О(N)
Это уже двусвязный список будет. На самом деле не всегда нужны проходы в обратном порядке, например, при реализации стека. Поэтому и односвязные списки занимают свою нишу.
@@selfedu_rus А если указывать на элемент списка чем нибудь другим, например курсором на экране, то перебирать весь список не нужно, нужно только чтобы каждый элемент связного списка указывал на предыдущий элемент и последующий.
Ощущаю себя олигофреном... Вроде всё схематически понятно. Но как реализовать без понятия. Посмотрел реализацию односвязного списка и ничего не понял. Реально затуп. Сложно в голову укладывается... Уважуха и белая зависть тем кто всё улавливает на лету)