Мне нужно реализовать круговую структуру данных односвязного списка. У меня проблемы с пониманием того, когда и где я должен указывать, что последний узел списка должен указывать на первый узел. У меня есть следующий пустой конструктор для построения списка:
public class SList<E> implements IList<E> {
protected SNode<E> firstNode = null;
public SList() {
firstNode = null;
}
Таким образом, в основном каждый список начинается с нулевого объекта, который снова указывает на нуль, что означает конец списка:
public class SNode<E> {
E elem;
public SNode<E> nextNode = null;
...
Однако я не знаю, как сделать так, чтобы когда список содержал хотя бы один узел, этот узел указывал на первый узел списка.
Например, взглянув на этот метод addLast (), который я реализовал для своего обычного связанного списка:
public void addLast(E newElem) {
SNode<E> newNode= new SNode<E>(newElem);
SNode<E> nodeTraveler = firstNode;
while (nodeTraveler.nextNode != null) {
nodeTraveler= nodeTraveler.nextNode;
}
nodeTraveler.nextNode = newNode;
}
Мне пришлось бы изменить его на что-то вроде:
public void addLast(E newElem) {
SNode<E> nodeTraveler = firstNode;
SNode<E> newNode = new SNode<E>(newElem);
while (nodeTraveler.nextNode != firstNode){
nodeTraveler = nodeTraveler.nextNode;
}
nodeTraveler.nextNode = newNode;
newNode.nextNode = firstNode;
}
nodeTraveler прекратит обход списка, как только его следующий узел совпадет с первым узлом (то есть он находится в последней позиции), а затем он изменит свой nextNode на тот, который мы хотим добавить, newNode, и укажет newNode на firstNode.
Теоретически это должно работать, но поскольку я никогда не указываю последний элемент на первый до этого метода (это мой главный вопрос, как указать последний элемент на первый по умолчанию), я получаю nullPointer исключение, когда код достигает итерации while.
Любая помощь будет оценена, спасибо.