Все еще не совсем уверен, может быть, есть некоторые варианты этого.
Особенно это вставляет перед первым Узлом, который больше, и я все еще не уверен, для чего используются дженерики в этом случае, и T должен бытьчто-то, что расширяет Student (ну, ему нужен метод CompareTo):
public void add(T data) {
for(Node<T> current = root; current != null; current = current.next) {
if (data.compareTo(current.data) <= 0) {
current = new Node<>(data,current.previous,current);
if(null == current.previous){
root = current;
}else {
current.previous.next = current;
}
if(null == current.next){
tail = current;
} else {
current.next.previous = current;
}
return;
}
}
tail = new Node<>(data,tail,null);
if(null == tail.previous) root=tail;
}
Так что ваш список должен выглядеть примерно так (чтобы T имел метод compareTo):
public class DoublyLinkedList<T extends Student> implements Iterable<Node<T>> {
...
}
Всевместе (лучше иметь Node в качестве отдельного файла, как вы, но для краткости я поместил его в список):
public class DoublyLinkedList<T extends Student> implements Iterable<Node<T>> {
public static class Node<S> {
Node<S> previous;
Node<S> next;
S data;
public Node(S data) {
this(data, null, null);
}
public Node(S data, Node<S> previous, Node<S> next) {
this.data = data;
this.previous = previous;
this.next = next;
}
}
private Node<T> root = null;
private Node<T> tail = null;
private class ListIterator implements Iterator<Node<T>> {
Node<T> current = root;
@Override
public boolean hasNext() {
return (current != null);
}
@Override
public Node<T> next() {
Node<T> answer;
answer = current;
current = current.next;
return answer;
}
}
@Override
public Iterator<Node<T>> iterator() {
ListIterator listIterator = new ListIterator();
return listIterator;
}
public void add(T data) {
for(Node<T> current = root; current != null; current = current.next) {
if (data.compareTo(current.data) <= 0) {
current = new Node<>(data,current.previous,current);
if(null == current.previous){
root = current;
}else {
current.previous.next = current;
}
if(null == current.next){
tail = current;
} else {
current.next.previous = current;
}
return;
}
}
tail = new Node<>(data,tail,null);
if(null == tail.previous) root=tail;
}
}