Implementação de LinkedList em Java
É 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.
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 esse 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 ver a implementação do método para adicionar um elemento ao final da lista. Vamos detalhar como esse método funciona:
-
Criamos um objeto da classe
Node, chamadonewNode, e o inicializamos através do construtor, passando odatarecebido nos parâmetros do métodoappend(); -
Em seguida, verificamos se a lista está vazia e, caso esteja, substituímos o primeiro elemento da lista (
head) pornewNodeatravés de reatribuição; -
Depois, adicionamos uma instrução
returnpara sair do método; -
Se a lista não estiver vazia, neste método, criamos um novo objeto,
current, que representa oNode headneste contexto; -
Utilizando um laço
while, iteramos por toda a lista até quecurrent.nextsejanull, ou seja, até determinarmos que o próximo elemento da lista está vazio; -
Assim que encontramos o último elemento não nulo da lista, definimos seu link para
newNode, adicionando assim o elemento à nossa lista.
Em outras palavras, o objetivo do método append foi definir o link do último elemento para o novo elemento. Dessa forma, adicionamos um novo elemento à 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(); }
-
A 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, define-se a condição para o laço while como
current != nulle exibe-se o campodatana tela; -
Para iterar pela lista, utiliza-se a referência por reatribuição de
current, que fica comocurrent = current.next;; -
Isso é feito até que o
Node currentse torne vazio. Após isso, o laço é encerrado e segue-se para a próxima linha.
Por sinal, 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, cuja 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 contrário, 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 tem a seguinte forma:
for (int i = 0; i < index; i++). Neste laço, localiza-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
Incrível!
Completion taxa melhorada para 4
Implementação de 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.
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 esse 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 ver a implementação do método para adicionar um elemento ao final da lista. Vamos detalhar como esse método funciona:
-
Criamos um objeto da classe
Node, chamadonewNode, e o inicializamos através do construtor, passando odatarecebido nos parâmetros do métodoappend(); -
Em seguida, verificamos se a lista está vazia e, caso esteja, substituímos o primeiro elemento da lista (
head) pornewNodeatravés de reatribuição; -
Depois, adicionamos uma instrução
returnpara sair do método; -
Se a lista não estiver vazia, neste método, criamos um novo objeto,
current, que representa oNode headneste contexto; -
Utilizando um laço
while, iteramos por toda a lista até quecurrent.nextsejanull, ou seja, até determinarmos que o próximo elemento da lista está vazio; -
Assim que encontramos o último elemento não nulo da lista, definimos seu link para
newNode, adicionando assim o elemento à nossa lista.
Em outras palavras, o objetivo do método append foi definir o link do último elemento para o novo elemento. Dessa forma, adicionamos um novo elemento à 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(); }
-
A 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, define-se a condição para o laço while como
current != nulle exibe-se o campodatana tela; -
Para iterar pela lista, utiliza-se a referência por reatribuição de
current, que fica comocurrent = current.next;; -
Isso é feito até que o
Node currentse torne vazio. Após isso, o laço é encerrado e segue-se para a próxima linha.
Por sinal, 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, cuja 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 contrário, 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 tem a seguinte forma:
for (int i = 0; i < index; i++). Neste laço, localiza-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!