Qual é a melhor maneira de criar uma lista vinculada em Java?
Qual é a melhor maneira de criar uma lista vinculada em Java?
Respostas:
A solução óbvia para desenvolvedores familiarizados com Java é usar a classe LinkedList já fornecida em java.util . Digamos, no entanto, que você queira fazer sua própria implementação por algum motivo. Aqui está um exemplo rápido de uma lista vinculada que insere um novo link no início da lista, exclui do início da lista e percorre a lista para imprimir os links nela contidos. Os aprimoramentos para esta implementação incluem torná-la uma lista com vínculo duplo , adicionando métodos para inserir e excluir a partir do meio ou final e adicionando métodos get e classificar também.
Nota : No exemplo, o objeto Link na verdade não contém outro objeto Link - nextLink é na verdade apenas uma referência a outro link.
class Link {
public int data1;
public double data2;
public Link nextLink;
//Link constructor
public Link(int d1, double d2) {
data1 = d1;
data2 = d2;
}
//Print Link data
public void printLink() {
System.out.print("{" + data1 + ", " + data2 + "} ");
}
}
class LinkList {
private Link first;
//LinkList constructor
public LinkList() {
first = null;
}
//Returns true if list is empty
public boolean isEmpty() {
return first == null;
}
//Inserts a new Link at the first of the list
public void insert(int d1, double d2) {
Link link = new Link(d1, d2);
link.nextLink = first;
first = link;
}
//Deletes the link at the first of the list
public Link delete() {
Link temp = first;
if(first == null){
return null;
//throw new NoSuchElementException(); // this is the better way.
}
first = first.nextLink;
return temp;
}
//Prints list data
public void printList() {
Link currentLink = first;
System.out.print("List: ");
while(currentLink != null) {
currentLink.printLink();
currentLink = currentLink.nextLink;
}
System.out.println("");
}
}
class LinkListTest {
public static void main(String[] args) {
LinkList list = new LinkList();
list.insert(1, 1.01);
list.insert(2, 2.02);
list.insert(3, 3.03);
list.insert(4, 4.04);
list.insert(5, 5.05);
list.printList();
while(!list.isEmpty()) {
Link deletedLink = list.delete();
System.out.print("deleted: ");
deletedLink.printLink();
System.out.println("");
}
list.printList();
}
}
public Link nextLink
e operar nele fora da classe. Poderia ser respeitável quando Link
seria uma classe interna de LinkList
. É outro monte de código escrito como Java era apenas outra versão do c.
Java tem uma implementação LinkedList , que você pode querer conferir. Você pode baixar o JDK e suas fontes em java.sun.com .
LinkedList
, você pode apenas vê-lo LinkedList.java
online aqui . Essa página até destaca a sintaxe do código e renderiza os comentários do Javadoc em linha.
Use java.util.LinkedList . Como isso:
list = new java.util.LinkedList()
A lista vinculada acima é exibida na direção oposta. Eu acho que a implementação correta do método insert deve ser
public void insert(int d1, double d2) {
Link link = new Link(d1, d2);
if(first==null){
link.nextLink = null;
first = link;
last=link;
}
else{
last.nextLink=link;
link.nextLink=null;
last=link;
}
}
É muito melhor usar o java.util.LinkedList, porque provavelmente é muito mais otimizado do que o que você escreverá.
//slightly improved code without using collection framework
package com.test;
public class TestClass {
private static Link last;
private static Link first;
public static void main(String[] args) {
//Inserting
for(int i=0;i<5;i++){
Link.insert(i+5);
}
Link.printList();
//Deleting
Link.deletefromFirst();
Link.printList();
}
protected static class Link {
private int data;
private Link nextlink;
public Link(int d1) {
this.data = d1;
}
public static void insert(int d1) {
Link a = new Link(d1);
a.nextlink = null;
if (first != null) {
last.nextlink = a;
last = a;
} else {
first = a;
last = a;
}
System.out.println("Inserted -:"+d1);
}
public static void deletefromFirst() {
if(null!=first)
{
System.out.println("Deleting -:"+first.data);
first = first.nextlink;
}
else{
System.out.println("No elements in Linked List");
}
}
public static void printList() {
System.out.println("Elements in the list are");
System.out.println("-------------------------");
Link temp = first;
while (temp != null) {
System.out.println(temp.data);
temp = temp.nextlink;
}
}
}
}