- 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;
}
}
- 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--;
}
}
- 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;
}
}