Трудно сказать, но подход LL выглядит неправильно. Обычно работа с LL не требует какого-либо знания «узлов», так как именно реализация должна обрабатывать все детали связывания. Код, который вызывает, должен передавать объекты по своему выбору.
Я ожидаю, что использование LL будет выглядеть следующим образом.
LL myLL = new LL();
myLL.add(new Integer(1));
myLL.add(new Integer(2));
// etc
myLL.remove(new Integer(1));
Во время вызова для добавления нового узла (внутреннего класса в LL) будет создан и добавлен в конец. Удаление / удаление будет искать LL и удалять первый экземпляр, который соответствует переданному объекту.
например. Черновой эскиз реализации LL.
class LL
{
private Node headNode = null;
public void add(Object item)
{
// construct a new node
// iterate to the last node and add new node to the end
}
public boolean remove(Object item)
{
// starting at the head node search the list until a node with the matching item is found
// update the node pointers to "remove" the node
}
class Node
{
Node nextNode;
Node prevNode;
Object item;
}
}
Я не буду заполнять реализации, так как это домашнее задание;) но вы правы, есть несколько случаев, которые нужно обработать
- Список пуст
- Предмет отсутствует
- Элемент находится в главном узле
- Элемент находится в другом узле
Удачи!