Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68

    [Java] ritorno sbagliato su Merge su ListaConcatenata

    Ciao a tutti. Ho implementato il mergeSort ricorsivo su una mia lista concatenata e mi sbaglia il ritorno del merge; in poche parole al posto di ritornarmi la lista ordinata, sembra che sovrascriv ogni volta sul primo elemento della lista. La mia lista concatenata è una semplice lista che ha un dato e un puntatore al prossimo elemento. Questo è il mio codice:



    codice:
    public ListaRicorsiva mergeSort () {
    	ListaRicorsiva lista1 = new ListaRicorsiva();
    	ListaRicorsiva lista2 = new ListaRicorsiva();
    	int meta = this.size()/2;
    	
    	if (meta == 0)
    		return this;
    	
    	else {
    		int cont = 1;
    		Nodo iterator = first;
    		while (cont <= meta) {
    			lista1.insertLast(iterator.getDato());
    			iterator = iterator.getNext();
    			cont++;
    		}
    		while (cont <= this.size()) {
    			lista2.insertLast(iterator.getDato());
    			iterator = iterator.getNext();
    			cont++;
    		}
    		return merge (lista1.mergeSort(), lista2.mergeSort());
    	}
    }
    	
    	
    public ListaRicorsiva merge (ListaRicorsiva lista1, ListaRicorsiva lista2) {
    	int cont1 = 0;
    	int cont2 = 0;
    	ListaRicorsiva listaOrdinata = new ListaRicorsiva();
    	Nodo iterator1 = lista1.first;
    	Nodo iterator2 = lista2.first;
    		
    	while (iterator1 != null && iterator2 != null) {
    		if (iterator1 != null && iterator2 != null) {
    			if(iterator1.getDato() < iterator2.getDato()) {
    				listaOrdinata.insertLast(iterator1.getDato());
    				iterator1 = iterator1.getNext();
    			}
    			else {
    				listaOrdinata.insertLast(iterator2.getDato());
    				iterator2 = iterator2.getNext();
    			}
    		}
    		else if (iterator1 != null && iterator2 == null) {
    			listaOrdinata.insertLast(iterator1.getDato());
    			iterator1 = iterator1.getNext();	
    		}
    		else if (iterator2 != null && iterator1 == null) {
    			listaOrdinata.insertLast(iterator2.getDato());
    			iterator2 = iterator2.getNext();
    		}
    	}
    	return listaOrdinata;
    }

    Grazie!!

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Potrei sbagliarmi, ma mi sembra che il problema sia qua:

    codice:
    while (iterator1 != null && iterator2 != null)
    Se uno dei due "iterator" (come li hai chiamati) diventa null l'esecuzione viene interrotta anche se l'altro iterator contiene ancora elementi non inseriti in "listaOrdinata"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68
    ah ok, allora che condizione dovrei mettere nel while?

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Per uscire dal while è necessario che entrambi gli "iteratori" siano diventati null (ovverosia che siano stati svuotati dei nodi).
    Quindi, il metodo più naturale per gestire tale condizione è

    codice:
    while (iterator1 != null || iterator2 != null)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    68
    sisi è vero, ora funziona tutto benissimo!! Thanks

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.