Похоже, большая часть вашего замешательства связана с тем, как работает header
.Это просто ссылка на первый узел в списке.Кроме того, нет необходимости во «вспомогательном» узле.
Давайте рассмотрим шаги, которые необходимо предпринять, чтобы:
Шаг 1: Установить pred
узла, который вы вставляете.
Поскольку узел станет первым узлом, за ним не будет никаких узлов, так что вы можете сказать v.pred = null;
Шаг 2: Установите succ
вставляемого узла.
Наш новый узел должен указывать вперед на старый первый узел.Вот где приходит путаница.Вы делаете следующее:
v.succ = header.succ ; // point new node succ to current first node
Но что такое header
?Это ссылка на первый узел.Говоря header.succ
, вы говорите, что хотите получить преемника первого узла, который является вторым узлом.Когда вы видите header
, просто подумайте «первый узел», и вы получите:
v.succ = header;
Шаг 3: Укажите старый первый узел обратно нановый узел
Вы уже делаете этот шаг правильно (помните, что заголовок «первый узел»):
header.succ = v ; //point header to new node
Шаг 4: Теперь сделайте новый узел заголовком
header = v;
РЕДАКТИРОВАТЬ (в ответ на ваши изменения # 3): В этом подходе есть некоторые проблемы, которыеЯ приведу в конце, но пока что в стороне, и при условии, что вы должны настроить свой список таким образом ...
Предполагая, что вы переходите в первый узел списка (Заголовок.succ) как v, давайте сделаем те же шаги:
Шаг 1: Установите pred
узла, который вы вставляете.
Вы хотите, чтобы ваш новый узелукажите назад на заголовок.v.pred = Header;
Шаг 2: Установите succ
вставляемого узла.
Вы хотите, чтобы ваш новый узел указывал на старый первый узел, которыйбыло Header.succ
v.succ = Header.succ;
Шаг 3: Укажите старый первый узел обратно на новый узел
Убедитесь, что выпервый узел существует первым (забыл об этом в моем первом посте)!
if (Header.succ != null) {
Header.succ.pred = v; // Header.succ is the first node, and you want to set its pred reference
}
Шаг 4: Теперь сделайте новый узел первым узлом
Header.succ = v;
Обратите внимание, каквам даже не нужно z
, поскольку вы можете добраться до первого узла, используя Header.succ
.Это означает, что вам не нужно использовать его в качестве параметра.
Теперь, кроме всего этого, есть некоторые проблемы, о которых вы должны подумать:
Какой смысл в заголовке, имеющем ссылку pred иполе данных?Какой смысл в хвосте, имеющем succ-ссылку и поле данных?
Если вы хотите использовать этот связанный список и вставлять элементы, не лучше ли было бы просто вызвать add () длякаждый элемент вместо addFirst () и addBeforeFirst ()?Что если бы вы могли использовать метод remove (), то вам нужно было бы отслеживать, является ли список пустым или нет, чтобы выяснить, какой метод вызывать, addFirst () или addBeforeFirst (), что довольно уродливо.Лучше написать более обобщенный метод add (), который позаботится об этом для пользователя, который будет использовать этот список.