Adicionar elementos em uma lista ligada com cauda é um processo simples, pois por padrão o novo elemento será sempre adicionado ao final da lista.
Mais adiante será demonstrado como adicionar novos elementos na posição p da lista.
Pelo fato de adicionarmos sempre no final da lista, o processo para isso consiste em criar um novo nó (node) com o valor desejado, e fazer sua referência utilizando o nó fim da lista ligada com cauda.
Repare que ao contrário de como adicionamos o elemento na lista ligada, onde existia a necessidade de percorrer toda a lista até encontrar o elemento final da lista, na lista ligada com cauda nós já temos a referência deste elemento, o que torna a operação mais simples e muito mais rápida.
Veja no código a seguir como fica esta implementação do método isoladamente:
public void adicionar(T valor) {
Node<T> novoNode = new Node<>(valor);
if (inicio == null) {
inicio = novoNode;
fim = novoNode;
} else {
fim.setProximo(novoNode);
fim = novoNode;
}
}
Repare no código acima que o algoritmo trata dois casos, o primeiro para quando a lista está vazia, e o segundo para quando a lista possui um ou mais elementos.
Quando a lista está vazia, o processo requer simplesmente adicionar a referência do novo nó (node) para inicio e fim, pois como a lista terá apenas um nó, ele será tanto o início quanto o fim da lista.
No cenário onde temos ao menos um elemento na lista, o processo é diferente, pois neste caso definimos o atual elemento do fim da lista referenciando o novo nó, e adicionamos ao nó fim da lista ligada com cauda a referência do novo nó, que passará a ser o últimos elemento da lista.
Veja agora o método integrado na classe de lista ligada criada previamente:
public class ListaLigadaCauda<T> {
private Node<T> inicio; // referência do nó inicial da lista
private Node<T> fim; // referência do nó final da lista
public ListaLigadaCauda() {
inicio = null;
fim = null;
}
public Node getInicio() {
return inicio;
}
public Node getFim() {
return fim;
}
public void adicionar(T valor) {
Node<T> novoNode = new Node<>(valor);
if (inicio == null) {
inicio = novoNode;
fim = novoNode;
} else {
fim.setProximo(novoNode);
fim = novoNode;
}
}
}
Conforme demonstrado no código, adicionar elementos em uma lista ligada com cauda é uma tarefa bem mais efetiva do que adicionar em listas nativas, pois aqui somente definimos uma referência para o nó e não precisamos mover os elementos como ocorreria em uma lista nativa.
Repare ainda como a lista ligada com cauda pelo fato de manter a referência do último elemento da lista, consegue adicionar um novo valor com uma excelente performance, sem a necessidade de percorrer a lista.
Portanto, caso o seu algoritmo necessite adicionar diversos valores a uma lista, a lista ligada seria uma melhor opção sob o uso de uma lista nativa (array).