Я реализую односвязный список в Java. Что мне не нравится в этом коде, так это то, что я должен проверять if (head.next == null)
каждый раз, когда добавляю элемент. Но условие выполняется только один раз, когда добавляется первый элемент.Добавление элемента в отдельный список в Java
Есть ли способ реализовать однонаправленный некруглый список без такого условия?
package sample;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class SinglyLinkedList<T> implements Iterable<T> {
private Node<T> head = new Node<T>(null);
private Node<T> last = null;
public SinglyLinkedList(T... elements) {
addAll(elements);
}
public void add(T element) {
if (head.next == null) {
head.next = new Node<T>(element);
last = head.next;
} else {
Node<T> newNode = new Node<T>(element);
last.next = newNode;
last = last.next;
}
}
public void addAll(T... elements) {
for (T element : elements) {
add(element);
}
}
@Override
public String toString() {
Iterator<T> iterator = iterator();
if (!iterator.hasNext()) {
return "[]";
}
StringBuilder builder = new StringBuilder();
builder.append("[");
while (iterator.hasNext()) {
T element = iterator.next();
builder.append(element);
if (!iterator.hasNext()) {
return builder.append("]").toString();
}
builder.append(", ");
}
return builder.toString();
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
Node<T> current = head;
@Override
public boolean hasNext() {
return current.next != null;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
Node<T> temp = current;
current = current.next;
return temp.next.element;
}
};
}
private static class Node<T> {
private Node<T> next;
private T element;
Node(T element) {
this.element = element;
}
@Override
public String toString() {
return element.toString();
}
}
}
Почему вам нужно 'last' объект? – Maroun
@MarounMaroun, потому что мне нужно добавить элементы в список. На самом деле, метод 'add' следует называть' addLast' –
@MarounMaroun, как вы думаете, 'last' является избыточным? Я видел несколько примеров, когда у них есть только указатель на голову и повторяется над списком, чтобы добавить элемент в конец. Таким образом, добавление будет принимать O (n), тогда как вложение в односвязный список должно принимать O (1). См. Также http://bigocheatsheet.com/ –