mark22 ha scritto:
è fatta da una lista linkata di nodi, generica
L'approccio tipico del shuffle è il seguente, dati n elementi con indici logici da 0 a n-1:
- nell'elemento a indice n-1 (l'ultimo) si mette il valore preso all'indice "casuale" tra 0 e n-1 (entrambi
inclusi)
- nell'elemento a indice n-2 si mette il valore preso all'indice "casuale" tra 0 e n-2 (entrambi
inclusi)
ecc...
In questo modo è possibile che un valore resti allo stesso posto. Se si vuole evitarlo, basta scalare ancora di 1 il limite superiore dell'estrazione casuale.
Ora, una lista linkata non è molto appropriata per questo. Le soluzioni sono due:
a) soluzione molto inefficiente: se hai dei get() e set() a indice (anche privati, non esposti) puoi fare quella logica. Ovviamente diventa "pesante" perché per ogni get o set di un elemento richiede di scorrere la lista fino a quel indice.
b) creare un array temporaneo con i valori dei nodi, applicare lo shuffle all'array e poi risettare i valori nei nodi (nota: NON serve toccare il "next" dei nodi)
Nota: la soluzione b) è quella che usa internamente lo shuffle() di java.util.Collections quando la lista che riceve NON implementa RandomAccess.