Implementando LinkedList em Java
Deslize para mostrar o menu
É hora de se desafiar com algumas tarefas realmente complexas.
Vamos implementar nossa estrutura de dados simplificada—especificamente, a SinglyLinkedList.
Vamos começar implementando a classe Node, que irá armazenar um valor e uma referência para o próximo Node.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
A implementação da classe Node em SinglyLinkedList já foi demonstrada no capítulo anterior, portanto não iremos nos aprofundar nela neste momento.
Em seguida, vamos criar a classe SinglyLinkedList, onde definiremos toda a lógica para nossa estrutura de dados:
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Criamos o campo Node head, que irá armazenar o primeiro elemento da nossa estrutura de dados.
Em uma LinkedList comum, também existem os campos head e tail que armazenam o primeiro e o último elementos da estrutura de dados. Como a estrutura de dados deve estar vazia durante a inicialização, definimos este campo como null no construtor.
Nossa estrutura de dados precisa oferecer suporte a todas as operações CRUD.
Criar
Vamos, então, passo a passo, escrever um método para adicionar um elemento ao final da lista, representando a operação de criação:
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Acima, é possível visualizar a implementação do método para adicionar um elemento ao final da lista. A seguir, a explicação de como esse método funciona:
-
Criação de um objeto da classe
Node, chamadonewNode, inicializado por meio do construtor, passando odatarecebido como parâmetro do métodoappend(); -
Em seguida, verificação se a lista está vazia; caso esteja, substituição do primeiro elemento da lista (
head) pornewNodeatravés de reatribuição; -
Inclusão de uma instrução
returnpara encerrar o método; -
Caso a lista não esteja vazia, criação de um novo objeto,
current, que representa oNode headneste contexto; -
Utilização de um laço
whilepara percorrer toda a lista até quecurrent.nextsejanull, ou seja, até identificar que o próximo elemento da lista está vazio; -
Ao encontrar o último elemento não nulo da lista, definição de seu link para
newNode, adicionando assim o elemento à lista.
Em resumo, o objetivo do método append foi definir o link do último elemento para o novo elemento. Dessa forma, um novo elemento é adicionado à lista.
Leitura
Vamos prosseguir; agora precisamos implementar a operação de leitura.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
Operação de leitura é bastante simples. É necessário iterar por cada elemento da lista e exibi-los na tela. Neste caso, também utilizamos o placeholder
current, que é inicializado com oNode head; -
Em seguida, definimos a condição para o laço while como
current != nulle exibimos o campodatana tela; -
Para iterar pela lista, utilizamos a referência por reatribuição de
current, que fica assim:current = current.next;; -
Isso é feito até que o
Node currentse torne vazio. Após isso, saímos do laço e seguimos para a próxima linha.
A propósito, reflita sobre como substituir esse laço while por um laço do-while. Isso é possível?
Atualização
Agora, vamos passar para o método de atualização, que possui uma implementação mais interessante:
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Primeiro, verifica-se se esse
indexestá presente na lista utilizando uma instruçãoif. Caso não esteja, exibe-se a mensagem "Invalid index" e encerra-se o método. Isso é feito para evitar erros; -
Se o índice estiver dentro dos limites da lista, prossegue-se com o algoritmo já conhecido. Inicialmente, cria-se um objeto da classe
Nodechamadocurrent, que é inicializado como ohead; -
Em vez de utilizar um laço
while, utiliza-se um laçofor, que é mais adequado neste caso pois se conhece o número exato de iterações necessárias. O número de iterações é igual ao valor do parâmetroindex; -
O laço fica assim:
for (int i = 0; i < index; i++). Neste laço, encontra-se o elemento desejado utilizando a operação já conhecida:current = current.next; -
Após encontrar o elemento desejado, atribui-se ao seu atributo
dataum novo valor, realizando a operaçãocurrent.data = newData. O valor denewDataé recebido como parâmetro deste método.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo