Здравствуйте, коллеги!
Иногда просматриваю варианты решения задач от Авторов JavaRUSH. По поводу задачи StringsLinkedList у меня возник вопрос относительно добавление элемента в конец двусвязного списка.
Процитирую авторов:
public void add(String value) {
if (first.next == null) {
Node node = new Node();
node.value = value;
first.next = node;
}
if (last.prev == null) {
last.prev = first.next;
return;
}
Node node = new Node();
node.value = value;
Node lastNode = last.prev;
lastNode.next = node;
node.prev = lastNode;
last.prev = node;
}
И вот что меня здесь смущает: две развилки, дважды описывается создание объекта узла и вишенка на торте - внезапный return посреди кода :)
Отдельное непонимание вызывают такие факты:
а) при создании первого узла его свойства next и prev остаются без инициализации;
б) при создании последующих узлов их свойство next остаётся без инициализации.
На мой взгляд что-то тут не так с двусвязностью.
В связи с вышеизложенным предлагаю такой вариант:
public void add(String value)
{
//напишите тут ваш код
Node newNode = new Node();
newNode.value=value;
if (first.next == null){ //создание первого элемента в списке
first.next=newNode; //маркер начала списка указывает на новый
last.prev=newNode; //маркер конца списка указывает на новый
newNode.prev=first; //новый указывает на маркер начала списка
newNode.next=last; //новый указывает на маркер конца списка
}else{ //вставка последующих элементов
newNode.next=last; //новый указывает на маркер конца списка
newNode.prev=last.prev; //новый указывает на предыдущий
last.prev.next=newNode; //предыдущий указывает на новый
last.prev=newNode; //маркер конца списка указывает на новый
}
}
Если ошибаюсь - прошу простить, понять, поправить и высказать Ваше мнение :)
first
иlast
. Они не содержат не значений и не участвуют в "пользовательской части" списка, т.е. не являются достижимыми из узлов пользовательской части списка. Вы же предлагаете включать эти узлы в общий список, что неверно. Представьте ситуацию: у Вас есть пустой список, а после добавления туда первого узла, у Вас появляется сразу 3 достижимых узла, 2 из которых не содержат значений.first
иlast
равныnull
):first: first.next показывает на созданный
,first.prev == null
.созданный.prev показывает на first
,созданный.next показывает на last
.last.prev показывает на созданный
,last.next == null
. При дальнейшем добавлении узлов получается цепочка без разрывов, используяfirst
движемся от начала к концу списка; применяяlast
можно описать перебор элементов от конца к началу списка. Так понимаю, вполне себе нормальная двусвязность в рамках задачи поставленой авторами JavaRUSH :) Если можно, уточните, пожалуйста, по поводу вашего кода: а)first
- это 1-й;last
- последний;prev
- предыдущий,next
- следующий. И, таким образом, должно быть:новый.prev указывает на first
,новый.next указывает на last
и т. д... А у вас что-то как-то не в ту сторону :) б) так понимаю, списочек ваш односвязный?first
- голова списка,last
- хвост. В пустом спискеfirst
иlast
указывают наnull
. Каждый узел имеет ссылкуprev
на предшествующий узел, и ссылкуnext
на следующий. Узлы добавляются в хвост списка.newNode.next
остаётся без инициализации. И подход с фиктивными узлами - это требование в задаче :) Так понимаю, вы к ней через пару-тройку дней доберётесь Для полноты картины даю мойget()
: И чтоб совсем всё было понятно для тех, кто ещё не видел эту задачу привожу описание узла списка от JavaRush:null
, и за последним элементом списка следуетnull