По
rear = new Node<T>(data, rear);
вы вставляете узел в начало связанного списка.Задняя часть указывает на первый узел.Ваша проблема в том, что последний узел не указал на первый узел.Я думаю, что лучше использовать 2 указателя, один указывает на начало, а другой - на конец.И затем, каждый раз, когда вы добавляете новый узел, не только позволяйте первому указателю указывать на новый узел, но также и указывайте конечному узлу на новый начальный узел.новый узел в начале списка.Если вы хотите вставить новый узел в конец списка, вы должны сделать это:
private Node<T> head = null;
private Node<T> rear = null;
public void add(T data) {
Node<T> node = new Node<T>(data,head);
if(head == null){
head = node;
node.setNext(head);
}
if(rear != null)
rear.setNext(node);
rear = node;
size++;
}