Lista ligada com cauda - obter valor da posição p


Curso de estrutura de dados e algoritmos em Java


Aprenda a obter o valor da posição p de uma lista ligada com cauda (tail)


Obter um elemento de uma lista ligada com cauda 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 ListaLigadaCauda<T> {

    private Node<T> inicio;
    private Node<T> fim;
    private int tamanho;

    public ListaLigadaCauda() {
        inicio = null;
        fim = null;
        tamanho = 0;
    }

    public int getTamanho() {
        return tamanho;
    }

    public Node getInicio() {
        return inicio;
    }

    public Node getFim() {
        return fim;
    }

}

Com a classe da lista ligada com cauda 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 for, até encontrar o nó correspondente a posição procurada.

Repare que podemos otimizar a busca para o elemento final da lista calculando se a posição dele é a final da lista, onde basta retornar o valor uma vez que temos a referência do nó final dela, 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.");
    }

    // caso busca pelo último valor, retorna ele diretamente do nó fim
    // uma vez que o primeiro índice é 0, 
    // tamanho deve ser o valor da posição + 1
    if ((posicao + 1) == tamanho) {
        return fim.getValor();
    }

    // Caso a busca não seja pela última posição,
    // itera na lista até encontrar o valor correto.
    Node<T> node = inicio;
    for (int pos = 0; pos < posicao; pos++) {
        node = node.getProximo();
    }

    return node.getValor();
}

Com o código implementado, veja como a classe da lista ligada com cauda fica com o método adicionada a ele, conforme o código a seguir:

public class ListaLigadaCauda<T> {

    private Node<T> inicio;
    private Node<T> fim;
    private int tamanho;

    public ListaLigadaCauda() {
        inicio = null;
        fim = null;
        tamanho = 0;
    }

    public int getTamanho() {
        return tamanho;
    }

    public Node getInicio() {
        return inicio;
    }

    public Node getFim() {
        return fim;
    }

    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.");
        }

        // caso busca pelo último valor, retorna ele diretamente do nó fim
        // uma vez que o primeiro índice é 0, 
        // tamanho deve ser o valor da posição + 1
        if ((posicao + 1) == tamanho) {
            return fim.getValor();
        }

        // Caso a busca não seja pela última posição,
        // itera na lista até encontrar o valor correto.
        Node<T> node = inicio;
        for (int pos = 0; pos < posicao; pos++) {
            node = node.getProximo();
        }

        return node.getValor();
    }

}

Com isso terminamos a implementação do método para obter um valor da lista.


Artigos recentes: