HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>О языках программирования</a><ul><li><a>Java - определение</a></li>
1 <ul><li><a>О языках программирования</a><ul><li><a>Java - определение</a></li>
2 </ul></li>
2 </ul></li>
3 <li><a>Связный список - понятие</a><ul><li><a>Плюсы и минусы перед массивами</a></li>
3 <li><a>Связный список - понятие</a><ul><li><a>Плюсы и минусы перед массивами</a></li>
4 <li><a>Узлы</a></li>
4 <li><a>Узлы</a></li>
5 </ul></li>
5 </ul></li>
6 <li><a>Односвязные</a><ul><li><a>Инициализация</a></li>
6 <li><a>Односвязные</a><ul><li><a>Инициализация</a></li>
7 <li><a>Добавление</a></li>
7 <li><a>Добавление</a></li>
8 <li><a>Удаление</a></li>
8 <li><a>Удаление</a></li>
9 <li><a>Вывод</a></li>
9 <li><a>Вывод</a></li>
10 <li><a>Обеспечение взаимообмена</a></li>
10 <li><a>Обеспечение взаимообмена</a></li>
11 </ul></li>
11 </ul></li>
12 <li><a>Двусвязные</a><ul><li><a>Метод добавления</a></li>
12 <li><a>Двусвязные</a><ul><li><a>Метод добавления</a></li>
13 <li><a>Метод поиска</a></li>
13 <li><a>Метод поиска</a></li>
14 <li><a>Стирание</a></li>
14 <li><a>Стирание</a></li>
15 </ul></li>
15 </ul></li>
16 </ul><p>Современные технологии стремительно развиваются. А вместе с тем появляются разнообразные способы создания софта. В процессе реализации поставленной задачи задействуются всевозможные элементы: односвязный список, а также операторы, переменные и так далее. Довольно популярным является некий Java. Он достоин внимания каждого уважающего себя программиста.</p>
16 </ul><p>Современные технологии стремительно развиваются. А вместе с тем появляются разнообразные способы создания софта. В процессе реализации поставленной задачи задействуются всевозможные элементы: односвязный список, а также операторы, переменные и так далее. Довольно популярным является некий Java. Он достоин внимания каждого уважающего себя программиста.</p>
17 <h2>О языках программирования</h2>
17 <h2>О языках программирования</h2>
18 <p>Языком программирования считают формальные правила и их наборы, необходимые для создания софта. Своеобразный элемент, посредством которого пользователь "общается" с компьютером и приложениями. Аналогичным образом техника "разговаривает" с программным обеспечением.</p>
18 <p>Языком программирования считают формальные правила и их наборы, необходимые для создания софта. Своеобразный элемент, посредством которого пользователь "общается" с компьютером и приложениями. Аналогичным образом техника "разговаривает" с программным обеспечением.</p>
19 <p>У каждого языка программирования имеется лексика - функции и операторы, при помощи которых согласно синтаксисным принципам составляются всевозможные выражения. Чтобы создать приложение, нужно выбрать язык и набрать исходный код. Кодификаций очень много. Одним из самых популярных является некий Java.</p>
19 <p>У каждого языка программирования имеется лексика - функции и операторы, при помощи которых согласно синтаксисным принципам составляются всевозможные выражения. Чтобы создать приложение, нужно выбрать язык и набрать исходный код. Кодификаций очень много. Одним из самых популярных является некий Java.</p>
20 <h3>Java - определение</h3>
20 <h3>Java - определение</h3>
21 <p>Java - способ "общения" пользователя с компьютером. Относится к объектно-ориентированному программированию и предусматривает строгую типизацию. Многофункциональный, универсальный.</p>
21 <p>Java - способ "общения" пользователя с компьютером. Относится к объектно-ориентированному программированию и предусматривает строгую типизацию. Многофункциональный, универсальный.</p>
22 <p>Джава используется для написания:</p>
22 <p>Джава используется для написания:</p>
23 <ul><li>Android-приложений;</li>
23 <ul><li>Android-приложений;</li>
24 <li>компьютерного софта;</li>
24 <li>компьютерного софта;</li>
25 <li>банковских утилит;</li>
25 <li>банковских утилит;</li>
26 <li>научных программ;</li>
26 <li>научных программ;</li>
27 <li>программного обеспечения, предназначенного для Big Data;</li>
27 <li>программного обеспечения, предназначенного для Big Data;</li>
28 <li>веб-утилит;</li>
28 <li>веб-утилит;</li>
29 <li>корпоративного ПО;</li>
29 <li>корпоративного ПО;</li>
30 <li>строенных систем (и маленькие чипы, и спецкомпьюетры).</li>
30 <li>строенных систем (и маленькие чипы, и спецкомпьюетры).</li>
31 </ul><p>Среди недостатков выделяют следующие черты:</p>
31 </ul><p>Среди недостатков выделяют следующие черты:</p>
32 <ul><li>невысокую скорость работы;</li>
32 <ul><li>невысокую скорость работы;</li>
33 <li>высокие требования к памяти устройства;</li>
33 <li>высокие требования к памяти устройства;</li>
34 <li>отсутствие поддержки низкоуровневого программирования;</li>
34 <li>отсутствие поддержки низкоуровневого программирования;</li>
35 <li>обновления 2019 года для бизнеса и коммерции - платные;</li>
35 <li>обновления 2019 года для бизнеса и коммерции - платные;</li>
36 <li>составление новой утилиты отнимает большое количество времени.</li>
36 <li>составление новой утилиты отнимает большое количество времени.</li>
37 </ul><p>Но Java может оказаться полезным. Это - объектно-ориентированная среда, функциональная и с простым синтаксисом. Надежный и независимый. Элементы, написанные на Джаве, запускаются на всех поддерживающих "языковую раскладку" девайсах.</p>
37 </ul><p>Но Java может оказаться полезным. Это - объектно-ориентированная среда, функциональная и с простым синтаксисом. Надежный и независимый. Элементы, написанные на Джаве, запускаются на всех поддерживающих "языковую раскладку" девайсах.</p>
38 <p>В процессе составления кода приложения используются односвязные списки и другие составляющие синтаксиса. Этот элемент является крайне важным в программировании.</p>
38 <p>В процессе составления кода приложения используются односвязные списки и другие составляющие синтаксиса. Этот элемент является крайне важным в программировании.</p>
39 <h2>Связный список - понятие</h2>
39 <h2>Связный список - понятие</h2>
40 <p>Связным списком (linked list) называется структура данных, в которой элементы упорядочены линейным образом. Сам порядок определяется не как в массивах по номерам этих самых составляющих, а указателями. Последние входят в состав элементов списка, применяются для указания на следующий "этап".</p>
40 <p>Связным списком (linked list) называется структура данных, в которой элементы упорядочены линейным образом. Сам порядок определяется не как в массивах по номерам этих самых составляющих, а указателями. Последние входят в состав элементов списка, применяются для указания на следующий "этап".</p>
41 <p>Должен содержать две "детали":</p>
41 <p>Должен содержать две "детали":</p>
42 <ul><li>голову;</li>
42 <ul><li>голову;</li>
43 <li>хвост.</li>
43 <li>хвост.</li>
44 </ul><p>Без этих составляющих списки линейного типа немыслимы.</p>
44 </ul><p>Без этих составляющих списки линейного типа немыслимы.</p>
45 <h3>Плюсы и минусы перед массивами</h3>
45 <h3>Плюсы и минусы перед массивами</h3>
46 <p>Корректировка связных элементов осуществляется за постоянное время (0(1)), чего нет в массивах. Может с легкостью расширяться. Для этого достаточно добавить очередной элемент.</p>
46 <p>Корректировка связных элементов осуществляется за постоянное время (0(1)), чего нет в массивах. Может с легкостью расширяться. Для этого достаточно добавить очередной элемент.</p>
47 <p>Но перед использованием соответствующей составляющей языка важно помнить: для поиска конкретного "предмета" требуется каждый раз проходить весь список. Время доступа к искомому = O (n).</p>
47 <p>Но перед использованием соответствующей составляющей языка важно помнить: для поиска конкретного "предмета" требуется каждый раз проходить весь список. Время доступа к искомому = O (n).</p>
48 <h3>Узлы</h3>
48 <h3>Узлы</h3>
49 <p>Новый узел (new node) - это элемент линейного списка. Содержит информацию, подлежащую дальнейшему сохранению, а также указатель на следующий элемент в "перечне" или значение NULL, если рассматриваемая "часть" является последней.</p>
49 <p>Новый узел (new node) - это элемент линейного списка. Содержит информацию, подлежащую дальнейшему сохранению, а также указатель на следующий элемент в "перечне" или значение NULL, если рассматриваемая "часть" является последней.</p>
50 <p>В приведенном примере описан код структуры, реализующий элемент связного списка (и всей "конструкции" тоже). Информация представляется числовыми данными.</p>
50 <p>В приведенном примере описан код структуры, реализующий элемент связного списка (и всей "конструкции" тоже). Информация представляется числовыми данными.</p>
51 <p>Простыми словами: синтаксис структуры для создания собственного типа информации для инкапсуляции узлов активно используется программистом. Здесь:</p>
51 <p>Простыми словами: синтаксис структуры для создания собственного типа информации для инкапсуляции узлов активно используется программистом. Здесь:</p>
52 <ul><li>Int n - сведения, которые хочется сохранить в узле;</li>
52 <ul><li>Int n - сведения, которые хочется сохранить в узле;</li>
53 <li>struct node*next - указатель на следующую составляющую в списке;</li>
53 <li>struct node*next - указатель на следующую составляющую в списке;</li>
54 <li>typedef-ed - не присваивается до выполнения соответствующих строк.</li>
54 <li>typedef-ed - не присваивается до выполнения соответствующих строк.</li>
55 </ul><p>Так, сначала записывается узел struct вместо предыдущего элемента перед и внутри фигурных скобочек. В последней строчке предоставляется node для tupedef в качестве имени, используемого для очередного типа данных оставшейся части приложения.</p>
55 </ul><p>Так, сначала записывается узел struct вместо предыдущего элемента перед и внутри фигурных скобочек. В последней строчке предоставляется node для tupedef в качестве имени, используемого для очередного типа данных оставшейся части приложения.</p>
56 <h2>Односвязные</h2>
56 <h2>Односвязные</h2>
57 <p>Односвязные списки - такие объекты, которые включают в себя "маркеры"-указатели на следующий узел. Из точки А можно попасть лишь в точку Б. Так пользователь будет двигаться в самый конец перечня. То есть, пошагово, последовательно.</p>
57 <p>Односвязные списки - такие объекты, которые включают в себя "маркеры"-указатели на следующий узел. Из точки А можно попасть лишь в точку Б. Так пользователь будет двигаться в самый конец перечня. То есть, пошагово, последовательно.</p>
58 <p>Вследствие происходит образование потоков, текущих в одном заданном направлении. Полем указателя последнего элемента служит нулевое значение. То есть, NULL.</p>
58 <p>Вследствие происходит образование потоков, текущих в одном заданном направлении. Полем указателя последнего элемента служит нулевое значение. То есть, NULL.</p>
59 <p>Основные манипуляции, осуществляемые посредством ОЛС:</p>
59 <p>Основные манипуляции, осуществляемые посредством ОЛС:</p>
60 <ul><li>инициализация;</li>
60 <ul><li>инициализация;</li>
61 <li>добавление новых элементов в перечень;</li>
61 <li>добавление новых элементов в перечень;</li>
62 <li>удаление узлов и корней;</li>
62 <li>удаление узлов и корней;</li>
63 <li>вывод составляющих списка;</li>
63 <li>вывод составляющих списка;</li>
64 <li>взаимообмен нескольких "частей" перечня.</li>
64 <li>взаимообмен нескольких "частей" перечня.</li>
65 </ul><p>Далее будут рассмотрены все эти операции с примерами кодов для большей наглядности.</p>
65 </ul><p>Далее будут рассмотрены все эти операции с примерами кодов для большей наглядности.</p>
66 <h3>Инициализация</h3>
66 <h3>Инициализация</h3>
67 <p>Операция необходима для того, чтобы создавать корневые узлы списков, у которых поля с указателями на следующие составляющие обладают нулевым значением:</p>
67 <p>Операция необходима для того, чтобы создавать корневые узлы списков, у которых поля с указателями на следующие составляющие обладают нулевым значением:</p>
68 struct list * init(int Z) // Z- информация в первом узле { struct list *lst; // осуществление выделения необходимой памяти для дальнейшей работы lst = (struct list*)malloc(sizeof(struct list)); lst-&gt;field = Z; lst-&gt;ptr = NULL; // обозначение последнего узла return(lst); }<p>Это - самый простой вариант развития событий. Но в процессе работы пригодятся и другие манипуляции.</p>
68 struct list * init(int Z) // Z- информация в первом узле { struct list *lst; // осуществление выделения необходимой памяти для дальнейшей работы lst = (struct list*)malloc(sizeof(struct list)); lst-&gt;field = Z; lst-&gt;ptr = NULL; // обозначение последнего узла return(lst); }<p>Это - самый простой вариант развития событий. Но в процессе работы пригодятся и другие манипуляции.</p>
69 <h3>Добавление</h3>
69 <h3>Добавление</h3>
70 <p>При добавлении элементов в списки функциям присваиваются следующие аргументы:</p>
70 <p>При добавлении элементов в списки функциям присваиваются следующие аргументы:</p>
71 <ul><li>информация для добавляемой составляющей;</li>
71 <ul><li>информация для добавляемой составляющей;</li>
72 <li>непосредственный указатель на задействованный элемент.</li>
72 <li>непосредственный указатель на задействованный элемент.</li>
73 </ul><p>Проводится в несколько этапов. Сначала создается добавляемый узел и заполняются его поля информации. Затем переустанавливаются предыдущие указатели на тот, что хочется внедрить. Завершающим этапом является установка указателей добавляемого элемента туда, куда "показывал" прошлый узел.</p>
73 </ul><p>Проводится в несколько этапов. Сначала создается добавляемый узел и заполняются его поля информации. Затем переустанавливаются предыдущие указатели на тот, что хочется внедрить. Завершающим этапом является установка указателей добавляемого элемента туда, куда "показывал" прошлый узел.</p>
74 struct list * addelem(list *lst, int number) { struct list *temp, *p; temp = (struct list*)malloc(sizeof(list)); p = lst-&gt;ptr; // сохранение "маркера" на последующий "объект" lst-&gt;ptr = temp; // указание предыдущим элементом на новый temp-&gt;field = number; // поля данных нового элемента сохраняются в память temp-&gt;ptr = p; // указание созданным узлом на предыдущий элемент return(temp);<p>Адрес добавленного узла - возвращаемое значение задействованной функции.</p>
74 struct list * addelem(list *lst, int number) { struct list *temp, *p; temp = (struct list*)malloc(sizeof(list)); p = lst-&gt;ptr; // сохранение "маркера" на последующий "объект" lst-&gt;ptr = temp; // указание предыдущим элементом на новый temp-&gt;field = number; // поля данных нового элемента сохраняются в память temp-&gt;ptr = p; // указание созданным узлом на предыдущий элемент return(temp);<p>Адрес добавленного узла - возвращаемое значение задействованной функции.</p>
75 <h3>Удаление</h3>
75 <h3>Удаление</h3>
76 <p>При удалении элементов ОЛС функциями аргументов служат указатели на подлежащий стиранию "объект", а также "маркер" его корня. Функции возвращают указатель на элемент, который следует за удаленным.</p>
76 <p>При удалении элементов ОЛС функциями аргументов служат указатели на подлежащий стиранию "объект", а также "маркер" его корня. Функции возвращают указатель на элемент, который следует за удаленным.</p>
77 <p>Тоже проводится в несколько шагов:</p>
77 <p>Тоже проводится в несколько шагов:</p>
78 <ul><li>постановка указателя предыдущей составляющей на следующий за тем, что подлежит деинсталляции;</li>
78 <ul><li>постановка указателя предыдущей составляющей на следующий за тем, что подлежит деинсталляции;</li>
79 <li>высвобождение памяти устройства.</li>
79 <li>высвобождение памяти устройства.</li>
80 </ul><p>Код будет примерно следующим:</p>
80 </ul><p>Код будет примерно следующим:</p>
81 struct list * deletelem(list *lst, list *root) { struct list *temp; temp = root; while (temp-&gt;ptr != lst) // список с корня просматривается с самого начала { // изучение до тех пор, пока не обнаружена "часть", предшествующая lst temp = temp-&gt;ptr; } temp-&gt;ptr = lst-&gt;ptr; // перестановка маркера в новое место free(lst); // освобождение положенной части памяти return(temp); }<p>В случае со стиранием корней ситуация обстоит иначе:</p>
81 struct list * deletelem(list *lst, list *root) { struct list *temp; temp = root; while (temp-&gt;ptr != lst) // список с корня просматривается с самого начала { // изучение до тех пор, пока не обнаружена "часть", предшествующая lst temp = temp-&gt;ptr; } temp-&gt;ptr = lst-&gt;ptr; // перестановка маркера в новое место free(lst); // освобождение положенной части памяти return(temp); }<p>В случае со стиранием корней ситуация обстоит иначе:</p>
82 struct list * deletehead(list *root) { struct list *temp; temp = root-&gt;ptr; free(root); // высвобождается память корня, который удаляли return(temp); // создание нового корня }<p>Функции удаления корней в списках в виде аргументов получают указатели на текущие корни перечней. Возвращаемое значение - новый корень. А именно - узел, на который указывал удаленный.</p>
82 struct list * deletehead(list *root) { struct list *temp; temp = root-&gt;ptr; free(root); // высвобождается память корня, который удаляли return(temp); // создание нового корня }<p>Функции удаления корней в списках в виде аргументов получают указатели на текущие корни перечней. Возвращаемое значение - новый корень. А именно - узел, на который указывал удаленный.</p>
83 <h3>Вывод</h3>
83 <h3>Вывод</h3>
84 <p>Отобразить элемент списка можно следующим макаром:</p>
84 <p>Отобразить элемент списка можно следующим макаром:</p>
85 void listprint(list *lst) { struct list *p; p = lst; do { printf("%d ", p-&gt;field); // выводится значение, присвоенное ранее p p = p-&gt;ptr; // осуществляется переход к следующей составляющей } while (p != NULL); }<p>Аргументом в функции вывода становится указатель на корень списка, а сама функция последовательно обходит все элементы перечня с последующим их выводом (значений).</p>
85 void listprint(list *lst) { struct list *p; p = lst; do { printf("%d ", p-&gt;field); // выводится значение, присвоенное ранее p p = p-&gt;ptr; // осуществляется переход к следующей составляющей } while (p != NULL); }<p>Аргументом в функции вывода становится указатель на корень списка, а сама функция последовательно обходит все элементы перечня с последующим их выводом (значений).</p>
86 <h3>Обеспечение взаимообмена</h3>
86 <h3>Обеспечение взаимообмена</h3>
87 <p>При подобных обстоятельствах кодификация, используемая для реализации поставленной задачи будет иметь примерно следующее представление:</p>
87 <p>При подобных обстоятельствах кодификация, используемая для реализации поставленной задачи будет иметь примерно следующее представление:</p>
88 struct list * swap(struct list *lst1, struct list *lst2, struct list *head) { // Возвращение нового корня списка struct list *prev1, *prev2, *next1, *next2; prev1 = head; prev2 = head; if (prev1 == lst1) prev1 = NULL; else while (prev1-&gt;ptr != lst1) // ищется элемент, который предшествует lst1 prev1 = prev1-&gt;ptr; if (prev2 == lst2) prev2 = NULL; else while (prev2-&gt;ptr != lst2) // осуществляется поиск узла, идущего перед lst2 prev2 = prev2-&gt;ptr; next1 = lst1-&gt;ptr; // "часть", идущая после lst1 next2 = lst2-&gt;ptr; // узел после lst2 if (lst2 == next1) { // непосредственный обмен данными соседних элементов lst2-&gt;ptr = lst1; lst1-&gt;ptr = next2; if (lst1 != head) prev1-&gt;ptr = lst2; } else if (lst1 == next2) { // обмен соседних узлов lst1-&gt;ptr = lst2; lst2-&gt;ptr = next1; if (lst2 != head) prev2-&gt;ptr = lst2; } else { // обмен отстоящий элементов if (lst1 != head) prev1-&gt;ptr = lst2; lst2-&gt;ptr = next1; if (lst2 != head) prev2-&gt;ptr = lst1; lst1-&gt;ptr = next2; } if (lst1 == head) return(lst2); if (lst2 == head) return(lst1); return(head); }<p>В этом случае работа связных списков основывается на обмене узлового характера. Аргументы функций ОЛС - это два указателя на обмениваемые узлы, а также указатели корня списка. Функция отвечает за возврат корневого "объекта" списка.</p>
88 struct list * swap(struct list *lst1, struct list *lst2, struct list *head) { // Возвращение нового корня списка struct list *prev1, *prev2, *next1, *next2; prev1 = head; prev2 = head; if (prev1 == lst1) prev1 = NULL; else while (prev1-&gt;ptr != lst1) // ищется элемент, который предшествует lst1 prev1 = prev1-&gt;ptr; if (prev2 == lst2) prev2 = NULL; else while (prev2-&gt;ptr != lst2) // осуществляется поиск узла, идущего перед lst2 prev2 = prev2-&gt;ptr; next1 = lst1-&gt;ptr; // "часть", идущая после lst1 next2 = lst2-&gt;ptr; // узел после lst2 if (lst2 == next1) { // непосредственный обмен данными соседних элементов lst2-&gt;ptr = lst1; lst1-&gt;ptr = next2; if (lst1 != head) prev1-&gt;ptr = lst2; } else if (lst1 == next2) { // обмен соседних узлов lst1-&gt;ptr = lst2; lst2-&gt;ptr = next1; if (lst2 != head) prev2-&gt;ptr = lst2; } else { // обмен отстоящий элементов if (lst1 != head) prev1-&gt;ptr = lst2; lst2-&gt;ptr = next1; if (lst2 != head) prev2-&gt;ptr = lst1; lst1-&gt;ptr = next2; } if (lst1 == head) return(lst2); if (lst2 == head) return(lst1); return(head); }<p>В этом случае работа связных списков основывается на обмене узлового характера. Аргументы функций ОЛС - это два указателя на обмениваемые узлы, а также указатели корня списка. Функция отвечает за возврат корневого "объекта" списка.</p>
89 <p>Могут рассматриваться разные ситуации:</p>
89 <p>Могут рассматриваться разные ситуации:</p>
90 <ul><li>заменяемые "частицы" находятся по соседству;</li>
90 <ul><li>заменяемые "частицы" находятся по соседству;</li>
91 <li>обрабатываемые узлы - не соседние.</li>
91 <li>обрабатываемые узлы - не соседние.</li>
92 </ul><p>Когда маркеры переустанавливаются, требуется проверка на причастность к корню списка. Если заменяемая составляющая является таковой, все нормально. В противном случае узел, предшествующий корневому, будет отсутствовать.</p>
92 </ul><p>Когда маркеры переустанавливаются, требуется проверка на причастность к корню списка. Если заменяемая составляющая является таковой, все нормально. В противном случае узел, предшествующий корневому, будет отсутствовать.</p>
93 <h2>Двусвязные</h2>
93 <h2>Двусвязные</h2>
94 <p>Еще один тип связных списков - двусвязный. Он похож на обычный, но составляющие хранят ссылки не только на следующие, но и на предыдущие "частицы". Это позволяет осуществлять перемещение по списку туда-сюда. Односвязный список, в отличие от предложенного вниманию, предусматривает только движение вперед.</p>
94 <p>Еще один тип связных списков - двусвязный. Он похож на обычный, но составляющие хранят ссылки не только на следующие, но и на предыдущие "частицы". Это позволяет осуществлять перемещение по списку туда-сюда. Односвязный список, в отличие от предложенного вниманию, предусматривает только движение вперед.</p>
95 <p>Каждый элемент в данном случае будет иметь несколько полей: next и prev, указатели на предыдущий/следующий составляющие соответственно.</p>
95 <p>Каждый элемент в данном случае будет иметь несколько полей: next и prev, указатели на предыдущий/следующий составляющие соответственно.</p>
96 <p>Далее будут рассмотрены основные операции с двусвязными "перечнями". Пусть они предусматривают несколько конструкторов (Null и DoublyList), в которых возможны различные действия.</p>
96 <p>Далее будут рассмотрены основные операции с двусвязными "перечнями". Пусть они предусматривают несколько конструкторов (Null и DoublyList), в которых возможны различные действия.</p>
97 <p>Для Null (изначально список пуст):</p>
97 <p>Для Null (изначально список пуст):</p>
98 <ul><li>data - место хранения имеющихся значений;</li>
98 <ul><li>data - место хранения имеющихся значений;</li>
99 <li>next - указатель на следующую составляющую "перечня";</li>
99 <li>next - указатель на следующую составляющую "перечня";</li>
100 <li>previous - маркер предыдущего элемента.</li>
100 <li>previous - маркер предыдущего элемента.</li>
101 </ul><p>Для DoublyList:</p>
101 </ul><p>Для DoublyList:</p>
102 <ul><li>tail - конец списка;</li>
102 <ul><li>tail - конец списка;</li>
103 <li>head - начало списка;</li>
103 <li>head - начало списка;</li>
104 <li>_lenght - извлечение количества узлов в "перечне";</li>
104 <li>_lenght - извлечение количества узлов в "перечне";</li>
105 <li>add(value) - добавление новой составляющей;</li>
105 <li>add(value) - добавление новой составляющей;</li>
106 <li>remove(position) - отвечает за удаление;</li>
106 <li>remove(position) - отвечает за удаление;</li>
107 <li>searchNodeAt(position) - поиск узла на заданной позиции.</li>
107 <li>searchNodeAt(position) - поиск узла на заданной позиции.</li>
108 </ul><p>Коды будут выглядеть соответственно:</p>
108 </ul><p>Коды будут выглядеть соответственно:</p>
109 <p>И public class Doubly:</p>
109 <p>И public class Doubly:</p>
110 <h3>Метод добавления</h3>
110 <h3>Метод добавления</h3>
111 <p>Двунаправленные списки предусматривают метод добавления. Приведенный пример отвечает за реализацию нескольких сценариев. Если перечень пуст, список по голове и хвосту получает добавляемый узел. Добавляется новый элемент. Когда "перечень" уже имеет "составляющие", нужно найти конец и установить добавляемый узел как tail.next.</p>
111 <p>Двунаправленные списки предусматривают метод добавления. Приведенный пример отвечает за реализацию нескольких сценариев. Если перечень пуст, список по голове и хвосту получает добавляемый узел. Добавляется новый элемент. Когда "перечень" уже имеет "составляющие", нужно найти конец и установить добавляемый узел как tail.next.</p>
112 <p>После этого задается двунаправленная обработка для нового окончания. Требуется установить в качестве tail.previous первоначальную конечную "составляющую".</p>
112 <p>После этого задается двунаправленная обработка для нового окончания. Требуется установить в качестве tail.previous первоначальную конечную "составляющую".</p>
113 <h3>Метод поиска</h3>
113 <h3>Метод поиска</h3>
114 <p>В данном случае действовать предстоит подобно ситуации с односвязными "перечнями":</p>
114 <p>В данном случае действовать предстоит подобно ситуации с односвязными "перечнями":</p>
115 <p>Предложенный спи сок будет обрабатываться для поиска элемента на заданной позиции.</p>
115 <p>Предложенный спи сок будет обрабатываться для поиска элемента на заданной позиции.</p>
116 <h3>Стирание</h3>
116 <h3>Стирание</h3>
117 <p>Это более сложный код для пользовательского понимания. Поэтому сначала стоит рассмотреть его представление:</p>
117 <p>Это более сложный код для пользовательского понимания. Поэтому сначала стоит рассмотреть его представление:</p>
118 <p>Здесь remove(position) будет обрабатывать несколько возможных ситуаций:</p>
118 <p>Здесь remove(position) будет обрабатывать несколько возможных ситуаций:</p>
119 <ol><li>Позиции, которая передается в качестве аргумента remove не имеет места. На экран будет выводиться сообщение об ошибке.</li>
119 <ol><li>Позиции, которая передается в качестве аргумента remove не имеет места. На экран будет выводиться сообщение об ошибке.</li>
120 <li>Позиция, служащая аргументом remove - это первый узел списка (голова). В случае подтверждения соответствующего утверждения head становится deleteNode, после чего в качестве нового начала назначается следующий узел в "перечне". Дальше осуществляется проверка на наличие большего количества "составляющих". Если они отсутствуют, head получает null, происходит переход к части if в операторе if-else. В теле "ифа" устанавливается конец (tail) в виде null. Происходит возврат списка в исходное "положение" пустого двусвязного "перечня". Когда удаляется первый узел и остается более одного элемента, осуществляется перемещение к else, после чего устанавливается свойство previous для головы на null. Это проделывается, так как перед началом других "объектов" больше нет.</li>
120 <li>Позиция, служащая аргументом remove - это первый узел списка (голова). В случае подтверждения соответствующего утверждения head становится deleteNode, после чего в качестве нового начала назначается следующий узел в "перечне". Дальше осуществляется проверка на наличие большего количества "составляющих". Если они отсутствуют, head получает null, происходит переход к части if в операторе if-else. В теле "ифа" устанавливается конец (tail) в виде null. Происходит возврат списка в исходное "положение" пустого двусвязного "перечня". Когда удаляется первый узел и остается более одного элемента, осуществляется перемещение к else, после чего устанавливается свойство previous для головы на null. Это проделывается, так как перед началом других "объектов" больше нет.</li>
121 <li>Позиция-аргумент remove - это окончание "перечня". Хвосту присваивается deleteNode, в качестве нового окончания выступает предыдущий узел. После нового tail другие узлы отсутствуют, а он получает свойство next как null.</li>
121 <li>Позиция-аргумент remove - это окончание "перечня". Хвосту присваивается deleteNode, в качестве нового окончания выступает предыдущий узел. После нового tail другие узлы отсутствуют, а он получает свойство next как null.</li>
122 <li>Цикл while разрывается, стоит лишь currentNide указать на элемент, который находится в позиции-аргументе remove. Далее происходит переназначение beforeNodeToDelete и afterToDelete на "объект", который идет после nodeToDelete и перед ним. Ссылки убираются на удаленный узел, переназначаются на правильные. Завершается операция установкой nodeToDelete в значении deletedNode, а значением служит null.</li>
122 <li>Цикл while разрывается, стоит лишь currentNide указать на элемент, который находится в позиции-аргументе remove. Далее происходит переназначение beforeNodeToDelete и afterToDelete на "объект", который идет после nodeToDelete и перед ним. Ссылки убираются на удаленный узел, переназначаются на правильные. Завершается операция установкой nodeToDelete в значении deletedNode, а значением служит null.</li>
123 </ol><p>В результате описанного алгоритма происходит уменьшение длины списка с последующим возвратом deletedNode.</p>
123 </ol><p>В результате описанного алгоритма происходит уменьшение длины списка с последующим возвратом deletedNode.</p>
124 <p>Теперь понятно, каким может быть первый элемент односвязного списка или двусвязного, как он называется и используется на практике. Приведенные примеры помогают лучше ориентироваться в изученной теме. Они не являются исчерпывающими.</p>
124 <p>Теперь понятно, каким может быть первый элемент односвязного списка или двусвязного, как он называется и используется на практике. Приведенные примеры помогают лучше ориентироваться в изученной теме. Они не являются исчерпывающими.</p>
125 <p>Односвязный список - элементарный, без "пути назад". В программах чаще всего используются их двусвязные аналоги, предоставляющие большее поле для различных манипуляций.</p>
125 <p>Односвязный список - элементарный, без "пути назад". В программах чаще всего используются их двусвязные аналоги, предоставляющие большее поле для различных манипуляций.</p>
126 <a></a>
126 <a></a>