2011-02-07 8 views
15

Al usar Java LinkedList, ¿cómo averigua las relaciones siguientes o anteriores del elemento?Lista Utilizada de Java Util: ¿cómo encontrarla después?

quiero decir, en una lista enlazada regulares me gustaría hacer algo como esto:

Node node1 = new Node(); 
Node node2 = new Node(); 
LinkedList list = new LinkedList(); 
list.add(node1); 
list.add(node2); 

//then my node1 will know who it's next is: 
assertEquals(node2, node1.next()); 

donde Nodo es mi propio contenedor de datos/objeto.

Pero en LinkedList de Java, los datos no parecen modificarse. Entonces, ¿cómo puedo averiguar quién es el elemento "siguiente" (o "anterior" en el caso de las listas doblemente vinculadas)?

+0

¿Qué pasaría si fuera 'list.add (node1); list.add (node1); '? –

+3

LinkedList de Java es un término incorrecto y engañoso para las personas que han aprendido sobre la "lista vinculada". No es la única cosa engañosa o, al menos, mal nombrada en Java (también me viene a la mente la "excepción de modificación concurrente"). Pero, por supuesto, puede esperar comentarios de los bebedores de Java-Kool'aid que creen que todo lo que crearon los dioses de Java es perfecto para explicar por qué LinkedList es realmente una lista de enlaces comp-sci y por qué soy estúpido y todo;) – SyntaxT3rr0r

+2

Hay un muchas cosas malas y terribles en Java, pero LinkedList y CME están bastante bien. A menos que quiera nombrarlo como ListImplementedAsDoubleLinkedList y YouOrSomebodyElseHadModifiedYourCollectionInTheMeantime, no sé cómo nombrarlo. Dicho esto, estoy de acuerdo en que un nombre mejor sería bueno, simplemente no puedo encontrar ninguno. – maaartinus

Respuesta

12

No puede. LinkedList es solo una implementación de List y no ofrece nada más. Necesitarías hacer el tuyo.

Para node1.next() necesitaría una referencia de node1 a la lista. En realidad, necesitaría referencias múltiples, ya que node1 puede estar allí varias veces. Además, puede estar contenido en múltiples Listas.

Quizás pueda usar ListIterator para esto.

+3

Eso es bastante triste, ya que esperaba una implementación de "lista enlazada". Oh, bueno, voy a hacer mi propia versión. – drozzy

+1

@drozzy - alternativamente, eche un vistazo a lo que está haciendo y vea si puede implementarlo mejor si no * piensa * en términos de los punteros 'siguiente' y' anterior'. –

+0

Deseo, pero estoy implementando un Range Tree, que requiere una lista doblemente vinculada de sus hojas. – drozzy

6

No sé qué clase de Node está utilizando, pero LinkedList<T> tiene su propia clase de nodo interno, a la que no tiene acceso. Si llama al add se agregará un valor de a la lista; no puede insertar explícitamente un nodo manteniendo un valor, ni acceder a los nodos por sí mismos de ninguna otra manera. Sí, eso puede ser un dolor a veces.

Si también necesita una lista vinculada con una encapsulación pública del nodo, necesitará encontrar una implementación diferente o hacer la suya propia.

+0

Lo siento, Node era mi propio contenedor imaginario para los datos. Diría que LinkedList de Java no es adecuado para mí en este caso. – drozzy

1

La parte "vinculada" del nombre de clase LinkedList solo se refiere a su implementación. La interfaz no expone los métodos explícitos para hacer lo que desea.

LinkedList implementa la interfaz Collection (y la lista), por lo que da un índice i de un elemento en la lista list, puede obtener los elementos anterior y siguiente con list.get(i-1) y list.get(i+1), respectivamente. Para una LinkedList, la implementación de estos métodos es bastante lenta. Si realiza una gran cantidad de operaciones previas/siguientes, considere implementar su lista o utilizar una ArrayList en su lugar.

+1

Sí, mucho para la lista "vinculada". – drozzy

1

Tengo que estar en desacuerdo con la respuesta aceptada. Puedes siempre que tengas el elemento principal. Una vez que pierde la referencia al primer elemento al eliminar y no devolver el siguiente elemento o insertar un elemento antes del primer elemento y no devolverlo, no podrá realizar sus búsquedas.

+0

Esto no tiene sentido para mí. Deje que el primer elemento sea '" f "', encuentre lo que viene después del elemento '" e "'. – maaartinus

2

Mejor Solución: Haga sus propios enlaces siguiente y última hora de construir un nuevo objeto de lista de elementos:

Sólo tiene un objeto lastInserted algún lugar más globalmente

public MyLinkedListItem(){ 
    if(lastInserted != null){ 
     lastInserted.next = this; 
     this.last = lastInserted; 
    } 
    lastInserted = this; 
} 
1

puede utilizar un iterador para moverse a través los nodos como:

Node node1 = new Node(); 
    Node node2 = new Node(); 
    LinkedList list = new LinkedList(); 
    list.add(node1); 
    list.add(node2); 

    Iterator <Node> m_iterator=list.iterator(); 

    //set iterator to first node 
    m_iterator.next(); 

    //then my node1 will know who it's next is: 
    assertEquals(node2, m_iterator.next()); 
Cuestiones relacionadas