Usuwanie z listy pierwszego elementu

0

Mam problem z usuwaniem pierwszego elementu z Listy. Wszystkie pozostałe normalnie się usuwają.

public class Lista {
    String atrybut;
    Lista nast;

    Lista(int n) {
    /*
     * Wczytuje ze standardowego wejścia n elementów tworząc listę n elementową
     */
        if (n > 0) {
            Scanner wejscie = new Scanner(System.in);
            atrybut = wejscie.next();
            nast = new Lista(n-1);
        }
    }

    Lista(String atrybut) {
        this.atrybut = atrybut;
        this.nast = null;
    }

    public static void usunElement(Lista l, String atrybut) {
    /*
     * Usuwa z listy l element o danym atrybucie.
     * Jeśli na liście nie ma takiego atrybutu, wtedy nie zmienia listy.
     */
        int dlugosc = Lista.dlugoscLista(l);
        Lista poprzednik = null;

        for (int i=0; i<dlugosc; i++) {
            if (l.atrybut.equals(atrybut)) {
                if (poprzednik == null) {
                    l = l.nast
                }
                else {
                    l = l.nast;
                    poprzednik.nast = l;
                }
            }
            else {
                poprzednik = l;
                l = l.nast;
            }
        }
    }

Gdy wypisuje elementy listy, to jeśli usuwany atrybut nie jest na początku, to wszystko działa, ale gdy jest na początku to nie zostaje usunięty.

0

Oj ziomuś źle to robisz.

Po pierwsze nie masz klasy przechowującej listę, ponieważ tak naprawdę Twoja klasa "Lista" przechowuje tylko element listy. Wywołując metodę "usunElement" nic nie modyfikujesz, tzn. jeżeli wcześniej trzymałeś element pierwszy listy, to nadal go trzymasz, ponieważ metoda usuwająca element nie zwraca "nowego" początku listy, ani nie zmienia stanu jakiejś innej klasy trzymającej listę. Usuwając element ze środka już zmieniasz faktycznie kolejność elementów i dlatego widać efekt, z kolei początek listy masz cały czas taki sam...

Np.
Lista l = new Lista(5); // w Twoim przypadku l to nie jest lista tylko pierwszy element listy
usunElement(l, "costam"); //wywołując tą metodę nie modyfikujesz swojego l, tylko kopię l przekazaną do metody

  1. Proponuję to zrobić tak jak bozia przykazała tj. stworzyć dwie klasy:
    class Element
    {
    String atrybut;
    Element nast;
    }

class Lista
{
Element poczatek;

public void usunElement(String atrybut)
{
this.poczatek = nowyPoczatekListy; //to sobie już sam zaprogramujesz
}
}

  1. Inne wyjście to zmodyfikowanie metody usunElement tak żeby zwracała nowy początek listy.
    Lista l = new Lista(5);
    l = usunElement(l, "costam");

public static Lista usunElement(Lista l, String atrybut)
{
return nowyPoczatekListy; //to sobie już sam zaprogramujesz
}

  1. Jeszcze inne wyjście to przerobienie metody tak żeby działała w kontekście klasy, a nie statycznie
    Lista l = new Lista(5);
    l.usunElement("costam");

a metodę zmieniamy na:
public Lista usunElement(String atrybut)
//i w metodzie operujemy na this czyli na klasie w kontekście której uruchamiasz metodę
//oczywiście przechodzenie po elementach nie może być na this tylko na kopii czyli nowy obiekt Lista

Mam nadzieję, że wyjaśniłem to wystarczająco jasno (sorry jestem chory i na lekach). Jak nie rozumiesz to pytaj.

0

Mam pytanie dotyczące usuwania całej listy. Wiadomo, że Java sama zarządza pamięcią, więc czy wystarczy zrobić coś w tym stylu:

    public Lista usunLista() {
        return poczatek = null;
    }
0

Tak, w Javie nie musisz się przejmować zwalnianiem pamięci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1