¿Cómo creo una estructura de datos de lista vinculada en Java? [cerrado]

135

¿Cuál es la mejor manera de hacer una lista vinculada en Java?

Lance Fisher
fuente
33
La mejor manera de hacer una lista vinculada es utilizar la lista vinculada integrada. No reescribas las clases integradas.
Peter Lawrey
21
esta pregunta es legítima y muy constructiva para la discusión de los programadores
anshulkatta

Respuestas:

220

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();
    }
}
Aaron
fuente
77
también podría mejorar fácilmente este código para usar genéricos para el tipo de datos en lugar de almacenar un int y un doble.
shsteimer
51
@shsteimer: definitivamente, pero dado que el único buen uso de este código es demostrar la técnica, no ayudaría a nadie. Solo difundiría la idea básica.
Joachim Sauer
8
No es un buen enfoque OO tenerlo public Link nextLinky operarlo fuera de la clase. Podría ser respetable cuando Linksería una clase interna de LinkList. Es otro montón de código escrito, ya que Java era solo otra versión de c.
Bart
1
Cuando inserte, su primer elemento nunca obtendrá un próximo enlace, a menos que me falte algo con referencias de Java
Chris S
¿Cómo puedo implementar el método delete (index)?
JohnDow
55

Java tiene una implementación de LinkedList , que es posible que desee consultar. Puede descargar el JDK y sus fuentes en java.sun.com .

dlinsin
fuente
¿Linkedlist de Java no le permite insertar y eliminar elementos en posiciones arbitrarias?
Seun Osewa
10
¿No es ese el objetivo de una lista vinculada?
jrockway
2
@Seun Osewa si desea agregar en una posición arbitraria, por favor use una ArrayList :)
headgrowe
3
En lugar de descargar el JDK para ver su implementación LinkedList, puede verlo en LinkedList.javalínea aquí . Esa página incluso sintaxis resalta el código y muestra los comentarios Javadoc en línea.
Rory O'Kane
17

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;
    }
} 
arnab sarkar
fuente
1
Agregue nuevo al final a menos que se indique lo contrario. :-)
9

Es mucho mejor usar java.util.LinkedList, porque probablemente esté mucho más optimizado que el que escribirá.

Jakub Arnold
fuente
15
Y funcionará la primera vez.
Peter Lawrey
7
//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;
            }
        }
    }
}
Anitha A
fuente