Obter um elemento de uma lista ligada consiste de duas etapas.
A primeira delas é validar que a posição é válida, que consiste em saber se a posição é maior ou igual a zero e se a posição é menor do que o tamanho.
Repare que este método implementará a posição iniciando de zero para seguir o mesmo padrão das arrays nativas.
Feita a validação da posição, a segunda etapa consiste em percorrer a lista até a posição desejada, retornando o seu valor no final.
Assim como foir feito no adicionar na posição p, adicionaremos o atributo int tamanho para registrar o tamanho da lista, e a lista ligada ficará da seguinte forma:
public class ListaLigada<T> {
private Node<T> inicio;
private int tamanho;
public ListaLigada() {
inicio = null;
tamanho = 0;
}
public int getTamanho() {
return tamanho;
}
public Node getInicio() {
return inicio;
}
}
Com a classe da lista ligada definida, vamos implementar o método para obter o valor por etapas, começando pela validação da posição, conforme o código a seguir:
public T obterPosicao(int posicao) {
// posição inicial da lista inicia em 0
if (posicao < 0 || posicao >= tamanho) {
throw new IllegalArgumentException("Posição inválida.");
}
}
Na segunda etapa da implementação, percorremos a lista ligada utilizando um laço while, até encontrar o nó correspondente a posição procurada, conforme o código a seguir:
public T obterPosicao(int posicao) {
// posição inicial da lista inicia em 0
if (posicao < 0 || posicao >= tamanho) {
throw new IllegalArgumentException("Posição inválida.");
}
// armazena a posição da lista na busca
int posicaoLista = 0;
// obtém a referência do nó inicial
Node<T> node = inicio;
// percorre a lista até encontrar o nó procurado
while (posicaoLista < posicao) {
node = node.getProximo();
posicaoLista++;
}
// retorna o valor procurado
return node.getValor();
}
Com o código implementado, veja como a classe da lista ligada fica com o método adicionada a ele, conforme o código a seguir:
public class ListaLigada<T> {
private Node<T> inicio;
private int tamanho;
public ListaLigada() {
inicio = null;
tamanho = 0;
}
public int getTamanho() {
return tamanho;
}
public Node getInicio() {
return inicio;
}
public T obterPosicao(int posicao) {
// posição inicial da lista inicia em 0
if (posicao < 0 || posicao >= tamanho) {
throw new IllegalArgumentException("Posição inválida.");
}
// armazena a posição da lista na busca
int posicaoLista = 0;
// obtém a referência do nó inicial
Node<T> node = inicio;
// percorre a lista até encontrar o nó procurado
while (posicaoLista < posicao) {
node = node.getProximo();
posicaoLista++;
}
// retorna o valor procurado
return node.getValor();
}
}
Com isso terminamos a implementação do método para obter um valor da lista.