Здравствуйте, коллеги! Иногда просматриваю варианты решения задач от Авторов 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; //маркер конца списка указывает на новый
        }
}
Если ошибаюсь - прошу простить, понять, поправить и высказать Ваше мнение :)