Это код для общего вида.
public class StringsLinkedList {
    private Node first = new Node();
    private Node last = new Node();

    public void printAll() {
        Node currentElement = first.next;
        while ((currentElement) != null) {
            System.out.println(currentElement.value);
            currentElement = currentElement.next;
        }
    }

    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;
    }

    public static class Node {
        private Node prev;
        private String value;
        private Node next;
    }
}
Приветствую, вот добрался до 14го уровня и попал на тему LinkedList. Попал, скажем, знатно. Первая задача показалась убер сложной и что удивительно - в обсуждении пустота. Возможно большая часть просто прошла мимо этого задания по причине того, что мол LinkedList никому не нужен. Ну а я просто человек такой, пока во всём не разберусь - не успокоюсь. Помню как со скрипом и болью проходил двоичные, шестнадцатеричные конверторы, но со временем понимание приходило и у меня получалось решить эти задания. Эта же задача... Сложно передать эмоции которые я испытываю от бессилия при виде решения этого (по моему мнению) монстра(а ведь в этой теме есть еще и вторая задача). Задачу не решил, просто нажал на правильное решение и случайно тыкнул на проверку вместо запуска. Пытался решить часа 2, но даже не приблизился к решению хоть на сколько-то. Что страшнее, оказалось, что я даже не в состоянии понять готовое решение. Наверное основная проблема в том, что я не понимаю как одно абстрактное значение можно присвоить другому, да так, чтобы это еще и как-то работало. Вот есть поле String value, это понятно, это объект, который выражается каким-то определенным значением (null или какими-то символами в кавычках). Я понимаю, что можно создать объект Node и присвоить ему значение value.
public static class Node {
        private Node prev;
        private String value;
        private Node next;
    }
Это, пожалуй всё, что я понимаю. Остальное как за завесой. Пройдусь по порядку и начну с первого(метод add лежит в основе всех моих бед):
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;
    }
1. что такое first.next? Как я понимаю first это объект класса Node который создан в классе StringsLinkedList, ни на что не указывает, просто существует, ничего не означает, это же справедливо и для объекта last. Я так понимаю в будущем, при помощи различных манипуляций мы вдыхаем в него какой-то смысл. next i prev же являются полями класса Node, если класс String или Integer можно выразить в каком-то виде, то как выражаются поля класса Node? Вот и получается странная конструкция ничего с ничем, которая в самом начале справедливо имеет значение null. 2.node.value | В целом мне ясно как можно присвоить объекту node поле value ибо его можно как-то выразить. Но совсем не понимаю в чем разница между node и node.value и почему в данной ситуации мы используем именно выражение first.next = node(возможно если лучше пойму first.next то и это каким-то образом прояснится). 3.В принципе второй блок if мне понятен. Если последнего числа у нас нет, то первое число будет и последним, это вроде как вся логика. Если не так, то прошу поправить. Так же все вопросы которые у меня есть к first.next относятся и к last.prev. 4. Последние 4 строки это вообще темный лес. Один сплошной, огромный, жирный знак вопроса. Возможно если выражение
Node lastNode = last.prev;
заменить на
Node lastNode = new Node();
lastNode = last.prev;
то станет понятнее что это. В следующих 3х строках вообще происходит какая-то магия. Одно присваивают другому, друг на друга меняют, а что конкретно происходит - даже дебаггер объяснить не в состоянии, все как-то слишком абстрактно. В процессе написания этого текста, пришло небольшое понимание, что все эти объекты которые ничего не значат возможно на самом деле выполняют функцию ссылок или указателей на те или иные объекты, значения. Но нет твердого понимания и это пугает. Понимаю, букв много, но как мне кажется, эта задача того заслуживает. Надеюсь найдется понимающий, умный и терпеливый человек, который сможет объяснить что тут вообще происходит, было бы здорово :) Может и для будущих поколений это тоже будет полезно. P.S. Возможно вам мои вопросы покажутся глупыми и вы подумаете как я вообще добрался до 14го уровня (хотя и не так далеко в целом) с таким скудным багажом знаний, я и сам по правде говоря понятия не имею, возможно я хотя бы смогу благодаря вам выяснить в какой теме остались пробелы и смогу их заполнить. P.P.S. Так же боюсь тема описана достаточно сумбурно, постарался оформить более менее качественно. Готов предоставить любые уточнения, открыт для любой конструктивной критики. Заранее спасибо.