Представьте:
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
узел с двумя полями ссылок и поле данных.
(Связные списки всегда легче понять, когда вы их.)
Мы могли бы два из них:
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
^ |
| V
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
Previous Node
поле 2-й точек узла к первому. У первого узла нет предшественников, поэтому это Previous Node
поле пусто.
Аналогичным образом поле Next Node
первого узла указывает на второй узел. Второй узел не имеет преемника, поэтому поле Next Node
пустого места.
Это то, что, как я считаю, требует требований: дважды связанный список с помощью указателей.
Edit 1: Три узла
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
^ |
| V
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
^ |
| V
+----------+-------+------+
| Previous | Data | Next |
| Node | Field | Node |
+----------+-------+------+
Как вы можете видеть, посетить (траверс) узлы в вперед образом, вы будете следовать поле ссылки одного узла, чтобы добраться до следующего узел. Аналогично, чтобы перейти в назад, вы следуете ссылке Previous Node
, чтобы перейти к предшественнику узла.
Хорошая проблема с ссылками заключается в том, что вам нужно всего лишь изменить поля ссылки, чтобы вставить узел в в середине из списка. Рисование процессов вставки остается в качестве упражнения для читателя.
Edit 2: Контейнер класса
Связанный список является контейнер из узлов. Для простых реализаций класс Container не должен быть узлом.
Контейнер имеет, а указателя на первый узел и, необязательно, указатель на последний узел:
+------+-------+
| Last | First |
| Node | Node |
+------+-------+
| |
| +---------------+
| |
| V
| +----------+-------+------+
| | Previous | Data | Next |
| | Node | Field | Node |
| +----------+-------+------+
| ^ |
| | V
| +----------+-------+------+
| | Previous | Data | Next |
| | Node | Field | Node |
| +----------+-------+------+
| ^ |
| | V
| +----------+-------+------+
| | Previous | Data | Next |
+->| Node | Field | Node |
+----------+-------+------+
При использовании контейнера класса, вам не нужно беспокоиться о использовании пустым узлом в качестве первого узла. Здесь мы используем простой указатель, указывающий на первый узел. Кроме того, есть указатель на последний узел.
Указатель на последний узел ускоряет операцию добавления узлов в список. Без этого указателя вам нужно будет пройти все узлы, чтобы найти последний, что занимает много времени.
Нет, вы затрудняете вопросы. Пусть один узел указывает на следующий узел, называемый * отдельно связанным списком *. Если вы действительно агрессивны, вы можете добавить еще один указатель, указывающий на предыдущий узел. Узлам нужен только один или два указателя, а не массив, еще не по крайней мере. –
Значит, мне нужен только один узел в моем классе? Потому что использование класса здесь является обязательным для моего задания. –
@TreyBrumley. Вашему классу списка нужен только указатель на первый узел в случае односвязного списка и, кроме того, один на последний, если он дважды связан. Остальные обрабатываются узлами. [Это] (https://en.wikipedia.org/wiki/Linked_list) может помочь вам понять основную концепцию. –