Если вы на самом деле строите реальную систему, тогда да, вы обычно просто используете материал из стандартной библиотеки, если там есть то, что вам нужно. Тем не менее, не думайте об этом как бессмысленное упражнение. Хорошо понимать, как все работает, и понимание связанных списков является важным шагом к пониманию более сложных структур данных, многих из которых нет в стандартных библиотеках.
Существуют некоторые различия между способом создания связанного списка и способом, которым это делает API коллекций Java. API коллекций пытается придерживаться более сложного интерфейса. Связанный список API коллекций также является двусвязным списком, пока вы создаете односвязный список. То, что вы делаете, больше подходит для назначения класса.
С вашим классом LinkedList
экземпляр всегда будет списком хотя бы из одного элемента. При такой настройке вы будете использовать null
, когда вам нужен пустой список.
Думайте о next
как о «остальной части списка». На самом деле, многие подобные реализации используют имя «tail» вместо «next».
Вот схема LinkedList
, содержащая 3 элемента:
Обратите внимание, что это LinkedList
объект, указывающий на слово («Hello») и список из 2 элементов. Список из 2 элементов имеет слово («стек») и список из 1 элемента. Этот список из 1 элемента имеет слово («Переполнение») и пустой список (null
). Таким образом, вы можете рассматривать next
как еще один список, который оказывается на один элемент короче.
Возможно, вы захотите добавить другой конструктор, который просто берет строку и устанавливает рядом с null
. Это будет для создания списка из 1 элемента.
Чтобы добавить, вы проверяете, является ли next
null
. Если это так, создайте новый список из одного элемента и задайте для него next
.
next = new LinkedList(word);
Если следующий не null
, тогда добавьте next
.
next.append(word);
Это рекурсивный подход, который является наименьшим количеством кода. Вы можете превратить это в итеративное решение, которое было бы более эффективным в Java * и не рисковало бы переполнением стека с очень длинными списками, но я предполагаю, что уровень сложности не нужен для Ваше назначение.
* В некоторых языках есть устранение хвостовых вызовов, что является оптимизацией, которая позволяет языковой реализации преобразовывать «хвостовые вызовы» (вызов другой функции как самый последний шаг перед возвратом) в (эффективно) «переход» , Это делает такой код полностью избегающим использования стека, что делает его более безопасным (вы не можете переполнить стек, если не используете его) и, как правило, более эффективно. Схема, пожалуй, самый известный пример языка с этой функцией.