2011-01-16 19 views
7

cómo encontrar el nodo intermedio en la lista unida sin cruces?cómo encontrar el nodo intermedio en la lista unida sin cruces?

¿es posible en primer lugar?

En un recorrido que utilizan el método tradicional de usar 2 punteros uno los cuales 2 posiciones y de salto de otro tipo que una posición de salto ..es Hay algún otro método para encontrar asiento intermedio en un recorrido

+1

Creo que es tramposo. habrá un ciclo, pero la cantidad de acciones es la misma que si lo recorriera dos veces. – Andrey

+0

@Andrey: Correcto. –

+0

@Audrey Estoy totalmente de acuerdo. Quien haya ideado esta típica respuesta "inteligente" debe ser abofeteada :) –

Respuesta

16

No, no es posible . Las direcciones de los nodos son arbitrarias, por lo que no hay forma de conocerlas sin atravesarlas.

1

Sí, puede hacerlo si controla todos los aspectos de las adiciones y eliminaciones de la lista.

Si mantiene una referencia a lo que se considera el nodo intermedio durante la adición o eliminación, entonces se puede hacer. Hay dos casos que deben ser manejados. Además, hay escenarios tales como dónde hay un número par de elementos a considerar. ¿Cuál será el nodo intermedio en tal situación? ect .. ect ..

Así que realmente no es buscando nodo intermedio, sino que lo sigue.

+0

Me gusta esta idea, pero igual tendrá que recorrer la lista más de lo que lo haría normalmente en la mitad de las inserciones, porque cuando agrega un nodo antes del nodo medio, es posible que deba seguir buscando el nodo que se encuentra justo antes del nodo intermedio. –

+0

Esto es solo de beneficio si solo está agregando/eliminando nodos en la cabeza o la cola. Si realiza inserciones/eliminaciones arbitrarias, deberá determinar si lo hace antes o después del nodo intermedio, lo que requiere un recorrido transversal. ¡O (n) inserción/eliminación no suena como una lista enlazada muy útil! –

+0

Además, al eliminar, tendrías que volver a encontrar el centro, ya que está vinculado de forma individual y no puedes dar un paso atrás. –

0
List list = new LinkedList(); 
    for (int i = 0; i < 50; i++) { 
    list.add(String.valueOf(i)); 
} 

int end = list.size() - 1; 
int start = 0; 
while (start > end) { 
    start++; 
    end--; 
} 
if(start == end) //The arrays length is an odd number and you found the middle 
    return start; 
else //The arrays length is an even number and there really isn't a middle 
    //Do something else here because you have an even number 

vi este código en alguna otra página solución ... ¿No es este otro método en el que la lista está siendo atravesada por separado !?

+0

SINGLY lista vinculada. No se puede hacer end--. –

0
import java.util.LinkedList; 
import java.util.List; 


public class consoleApp 
{ 
    public static void main(String[] args) 
    { 
     List list = new LinkedList(); 
     for (int i = 0; i < 50; i++) 
     { 
      list.add(String.valueOf(i)); 
     } 

     int end = list.size(); 

     int start = 0; 
     while (start< end) 
     { 
      start++; 
      end--; 
     } 

     if(start == end) 
      System.out.println(start); 
    } 
} 
+0

Esto le da el índice del nodo intermedio, no el elemento – Origin

+0

En su ejemplo: list.get (list.size()/2) es suficiente para obtener un punto medio, supongo. – Ashish

15
public void findMiddleNode() { 
    Node n1 = headNode; 
    Node n2 = headNode; 
    while(n2.getNext() != null && n2.getNext().getNext()!= null) { 
     n1 = n1.getNext(); 
     n2 = n2.getNext().getNext(); 
    } 

    System.out.println("middle node is "+n1.getKey()); 
} 
Cuestiones relacionadas