2010-07-21 14 views
5

En mi aplicación Java se compilarán y ejecutarán los siguientes elementos, y se obtendrá el resultado deseado.Java - Objetos "rotativos" en una lista enlazada - ¿LinkedList.addLast (LinkedList.removeFirst()) Programación buena o mala?

//"Rotate" the list items one place to the left. 
myLinkedList.addLast(myLinkedList.removeFirst()); 

y un "giro" en la dirección opuesta

//"Rotate" the list items one place to the right. 
myLinkedList.addFirst(myLinkedList.removeLast()); 

Ambos "rotaciones" sólo requieren una línea de código cada uno, pero me pregunto si esta es la forma correcta de hacerlo ? ¿Hay algún inconveniente en este enfoque?

Existe una forma mejor, más robusta y menos propensa a errores de la misma que la anterior, que requeriría más de una línea de código y, de ser así, explique por qué.

Respuesta

4

parece estar bien para mí. Si usted tuviera un buffer circular que realmente era completa sólo podía mover el índice de "inicio/final", pero creo que el enfoque de lista enlazada va a funcionar bastante bien. En particular, sigue siendo O (1).

+0

Esto es muy parecido a lo que hace 'ArrayDeque'. – finnw

+0

Gracias Jon, el índice "start \ end" es una buena idea que voy a utilizar. El código que publiqué es parte de la lógica detrás de un rompecabezas de bloque deslizante que desarrollé en Swing. –

2

sugiere emplear Collections.rotate.

+4

'Collections.rotate' toma el tiempo O (N). 'removeFirst' /' addLast' es O (1). – finnw

+3

Esto hace que el intento sea claro, pero en cuanto al rendimiento es mucho peor. El acceso al primer/último elemento de una lista vinculada y anexar/anteponer es posible en tiempo constante, mientras que Collections.rotate necesita un tiempo lineal al tamaño de la lista. Alguien probablemente deba crear una solicitud de función para un caso especial para LinkedList. –

+1

La pregunta no tiene el rendimiento como un requisito. La optimización prematura es la raíz de todos los males, etc. Si estaba buscando mejorar el rendimiento, probablemente existan otras cosas mucho más importantes, como usar una estructura basada en arreglos. Por lo tanto, prefiero la forma mejor, más robusta y menos propensa a errores de hacer lo mismo. –

1

Me aplicar exactamente como usted tiene.

myLinkedList.addLast(myLinkedList.removeFirst()); 

La única manera que puedo ver que era "mala programación" es si la lista está compartido entre hilos y su método de gira un elemento de un extremo al otro sin que mantiene un bloqueo (No estoy al tanto de cualquier concurrente Queue aplicación que puede girar de forma atómica.)

+0

Gracias por su aporte, finnw. Aunque no soy un codificador profesional, siempre me esfuerzo por hacer las cosas correctamente, de ahí mi "buena/mala programación". consulta. –

+0

Y la m en frente del nombre de la variable. –

+0

@Steve Kuo, sospecho que el nombre se compone de la pregunta y no es el nombre de la variable real, tal como se utiliza en el programa – finnw

Cuestiones relacionadas