¿Cuál es la mejor manera de hacer una lista vinculada en Java?
¿Cuál es la mejor manera de hacer una lista vinculada en Java?
Respuestas:
La solución obvia para los desarrolladores que están familiarizados con Java es usar la clase LinkedList ya proporcionada en java.util . Digamos, sin embargo, que quería hacer su propia implementación por alguna razón. Aquí hay un ejemplo rápido de una lista vinculada que inserta un nuevo enlace al principio de la lista, la elimina desde el principio de la lista y recorre la lista para imprimir los enlaces que contiene. Las mejoras a esta implementación incluyen convertirla en una lista de doble enlace , agregar métodos para insertar y eliminar desde el medio o el final, y también agregar métodos get y sort .
Nota : En el ejemplo, el objeto Link en realidad no contiene otro objeto Link; nextLink en realidad es solo una referencia a otro enlace.
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
y operarlo fuera de la clase. Podría ser respetable cuando Link
sería una clase interna de LinkList
. Es otro montón de código escrito, ya que Java era solo otra versión de c.
Java tiene una implementación de LinkedList , que es posible que desee consultar. Puede descargar el JDK y sus fuentes en java.sun.com .
LinkedList
, puede verlo en LinkedList.java
línea aquí . Esa página incluso sintaxis resalta el código y muestra los comentarios Javadoc en línea.
Use java.util.LinkedList . Me gusta esto:
list = new java.util.LinkedList()
La lista vinculada anterior se muestra en la dirección opuesta. Creo que la implementación correcta del método de inserción debería 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;
}
}
Es mucho mejor usar java.util.LinkedList, porque probablemente esté mucho más optimizado que el que escribirá.
//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;
}
}
}
}