Resolução de Problemas Clássicos com Listas Encadeadas em Java

  1. Remoção de Elementos em Listas Encadeadas

Para eliminar nós com um valor específico, empregamos um nó auxiliar que simplifica o gerenciamento de ponteiros. O percurso é feito por um ponteiro que sempre se posiciona no nó anterior ao alvo, permitindo remoções eficientes.


public class SolucaoRemocao {
    public ListNode removerElementos(ListNode cabeca, int alvo) {
        ListNode noFicticio = new ListNode(0);
        noFicticio.next = cabeca;
        ListNode corrente = noFicticio;
        while (corrente.next != null) {
            if (corrente.next.val == alvo) {
                corrente.next = corrente.next.next;
            } else {
                corrente = corrente.next;
            }
        }
        return noFicticio.next;
    }
}

  1. Implementação de uma Lista Encadeada Personalizada

Construímos uma lista encadeada com operações fundamentais, utilizando um nó auxiliar para facilitar inserções e exclusões. O percurso é controlado para acesssar o índice desejado antes de executar modificações.


class MinhaListaEncadeada {
    private Node cabecalho;
    private int tamanho;

    public MinhaListaEncadeada() {
        cabecalho = new Node(0);
        tamanho = 0;
    }

    public int obter(int indice) {
        if (indice < 0 || indice >= tamanho) {
            return -1;
        }
        Node corrente = cabecalho;
        for (int i = 0; i <= indice; i++) {
            corrente = corrente.next;
        }
        return corrente.val;
    }

    public void adicionarNoCabecalho(int valor) {
        Node novoNo = new Node(valor);
        novoNo.next = cabecalho.next;
        cabecalho.next = novoNo;
        tamanho++;
    }

    public void adicionarNaCauda(int valor) {
        Node novoNo = new Node(valor);
        Node corrente = cabecalho;
        while (corrente.next != null) {
            corrente = corrente.next;
        }
        corrente.next = novoNo;
        tamanho++;
    }

    public void adicionarNoIndice(int indice, int valor) {
        if (indice < 0 || indice > tamanho) {
            return;
        }
        Node novoNo = new Node(valor);
        Node corrente = cabecalho;
        for (int i = 0; i < indice; i++) {
            corrente = corrente.next;
        }
        novoNo.next = corrente.next;
        corrente.next = novoNo;
        tamanho++;
    }

    public void removerNoIndice(int indice) {
        if (indice < 0 || indice >= tamanho) {
            return;
        }
        Node corrente = cabecalho;
        for (int i = 0; i < indice; i++) {
            corrente = corrente.next;
        }
        corrente.next = corrente.next.next;
        tamanho--;
    }
}

  1. Inversão de uma Lista Encadeada

Aplicamos recursão para inverter a lista, dividindo o problema em subproblemas até chegar ao caso base. A abordagem garante uma solução elegante e eficiente.


public class SolucaoInversao {
    public ListNode inverterLista(ListNode cabeca) {
        if (cabeca == null || cabeca.next == null) {
            return cabeca;
        }
        ListNode resultado = inverterLista(cabeca.next);
        cabeca.next.next = cabeca;
        cabeca.next = null;
        return resultado;
    }
}

Tags: java LinkedList DataStructures recursion

Publicado em 7-1 23:22