Ciao Nep. Premetto che non sviluppo in java ma in .net, mi permetto di rispondere perche linguaggio e framework sono molto simili.
credo che anche in java la GC sia non deterministica e quindi potenzialmente se lista_nodi2 è grossa anche se la precedente è candidata per essere trashata non è detto che lo sia all'atto di istanziare la successiva questo potrebbe essere una delle cause.
Se ho capito bene dal codice tu hai necessita di eseguire le operazioni matematche per ogni nodo della lista_nodi con tutti gli altri nodi. Per fare questo prima di creare l'iteratore it2 COPI l'intera lista in una lista_nodi2, elimini l'elemento h-esimo e poi ti crei it2... mi sembra troppo dispendioso. E se it2 lo creassi da lista_nodi e nel while interno controllassi prima di fare qualsiasi cosa che la posizione di it2 non sia h?
Non chiedermi come si fa in java (io ho i foreach, linq... ) ma sono sicuro che si possa faRE.
Spero di averti dato un aiutino e se cosi nn si risolve allora è probabile che bisognerebbe guardare la funzione calcola_distanza perche non vorrei che anche li per comodita copi gli arrayList dentro altri.
Ciao.