Ich implementiere eine einfach verkettete Liste in Java. Was ich an diesem Code nicht mag ist, dass ich jedes Mal, wenn ich ein Element hinzufüge, if (head.next == null)
überprüfen muss. Aber die Bedingung wird nur einmal erfüllt, wenn das erste Element hinzugefügt wird.Hinzufügen eines Elements zu einer einfach verknüpften Liste in Java
Gibt es eine Möglichkeit, eine einfach verknüpfte nicht-zirkuläre Liste ohne eine solche Bedingung zu implementieren?
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();
}
}
}
Warum Sie das 'last' Objekt brauchen? – Maroun
@MarounMaroun, weil ich Elemente an die Liste anhängen muss. Eigentlich sollte die Methode 'add'' 'addLast' genannt werden. –
@MarounMaroun, denkst du' last' ist überflüssig? Ich sah einige Beispiele, wenn sie nur den Kopfzeiger haben und über die Liste iterierten, um ein Element am Ende hinzuzufügen. Somit würde die Addition O (n) annehmen, wohingegen die Insertion in eine einfach verknüpfte Liste O (1) annehmen sollte. Siehe auch http://bigocheatsheet.com/ –