wpinanie usunietych elementow do nowej listy

0

Dobry wieczór!
Mam taki mały problem- brak weny a może umiejętnośći. Napisałem liste, która zawiera podstawowe funkcje tj. dodaj, usuń etc. Jednakże chciałem ją rozszerzyć o metodę, która umożliwia usuwanie nieparzystych elementów listy i tutaj jest problem- chciałbym utworzyć z usuniętych elementów nową listę. Zastanawiałem się nad rozszerzeniem metod jakie już napisałem (dodaj, dodaj2, dodaj3), ale nie potrafię rozwiązać tego problemu(Może metoda usuńNieparzyste() powinna zwracać na przykład tablicę tych elementów, czy może jakoś można to zrobić prościej, albo jakiś fajny triczek). Prosiłbym o konkretne wskazówki :)
Oto mój kod, który się składa z 3 klas (Lista, main, element):

Main:

public class main 
{
    public static void main(String[] args) 
    {
    element element1= new element(3);
    element element2= new element(15);
    element element3= new element(11);

    element1.next=element2;
    element2.next=element3;

    
    Lista lista = new Lista(element1);
// lista.usuńNieparzyste();
//   lista.drukuj();
    lista.dodaj(2);
   // lista.dodaj2(3);
    lista.dodaj3(123, element3);
    lista.drukuj();
    lista.usuńNieparzyste(lista.długość());
    lista.usuń(3);
        System.out.println("");
    lista.drukuj();
    System.out.println("Długość listy wynosi: " + lista.długość() );
    }
}

Lista:

public class Lista {

    element head;

    Lista() {
    }

    Lista(element head) {
        this.head = head;
    }

    public void drukuj() {
        element p = this.head;
        while (p != null) {
            System.out.println(p.value);
            p = p.next;
        }
    }

    public int długość() {
        int licznik = 0;
        element p = this.head;
        while (p != null) {
            p = p.next;
            licznik++;
        }
        return licznik;

    }

    public void dodaj(int x) {
        element p = this.head;
        while (true) {
            if (p.next == null) {
                p.next = new element(x);
                break;
            } else {
                p = p.next;
            }

        }
    }

    public void dodaj2(int x) {
        element a = new element();
        a.next = head;
        a.value = x;

        head = a;
    }

    public void dodaj3(int x, element v) {
        element l;
        if (head == null) {
            l = new element(x, null);
            head = l;
        } else {
            l = new element(x, v.next);
            v.next = l;
        }

    }

    public void usuń(int x) {
        element l = head;
        element wcześniej = null;
        while (l != null && l.value != x) {
            wcześniej = l;
            l = l.next;
        }
        if (l != null) {
            if (wcześniej == null) {
                head = l.next;
            } else {
                wcześniej.next = l.next;
            }
        }

    }

    public void usuńNieparzyste(int licznik) {
        for (int a = 0; a < licznik; a++) {
            element l = head;
            element wcześniej = null;
            while (l != null && (l.value % 2) == 0) {
                wcześniej = l;
                l = l.next;
            }
            if (l != null) {
                if (wcześniej == null) {
                    head = l.next;
                } else {
                    wcześniej.next = l.next;
                }
            }
        }
    }
    public int następny(int x)
    {
        element l = head;
        
        int k;
        element wcześniej = null;
        while (l != null && l.value != x) {
            wcześniej = l;
            l = l.next;
        }
        l=l.next;
       k=l.value;
        
        return k;
                  
    }
    public int wcześniejszy(int x)
    {
        element l = head;
        
        int k;
        element wcześniej = null;
        while (l != null && l.value != x) {
            wcześniej = l;
            l = l.next;
        }
        k=wcześniej.value;
        return k;
                  
    }
    
}

element:

public class element {
    int value;
    element next;
    element()
    {}
    public element(int value)
    {
    this.value=value;
    }
    public element(int value, element next)
    {
    this.value=value;
    this.next=next;
    }
}
0

Po co piszesz własną implementacje listy? nie lepiej użyć tej dostępnej w javie?

0

No wiadomo, że łatwiej użyć, ale w celach dydaktycznych(uczę się javy 1,5 miesiąca) to wydało mi się to wskazane ;)

1

Fajniej by było, gdybyś takich rzeczy jak implementacje własnych list, stosów, kolejek itd pisał np. w C/C++ z wykorzystaniem wskaźników, myślę, ze dzięki troszkę 'niższemu' spojrzeniu na ten temat lepiej można zrozumieć istotę tych struktur danych. Implementacja tego w Javie nie ma większego sensu.

0

No dobrze w takim układzie proszę o pomoc jakby to napisać w języku c/cpp. Rozumiem, że można to zrobić prościej, albo w innym języku pewnie można zrobić inne rzeczy, ale upierałbym się o ten sposób chyba, że nie ma nikt na to pomysłu żadnego :x

0

Jeśli rzeczywiście się uczysz takich rzeczy, to:

  1. Stwórz własną implementację listy, tzn.
public class MyList<T> implements List<T> {
	// methods
}
  1. Napisz do niej testy - do wszystkich metod.
  2. Wyklep implementacje metod.

Wyjdzie Ci to na dużo zdrowiej, tzn. nauczysz się testowania kodu, napatrzysz się na jeden z kluczowych interfejsów w Javie (List), nauczysz się czytać JavaDoci (żeby dowiedzieć się, jakie są wymagania dotyczące danych metod).

Implementacja tego w Javie nie ma większego sensu.

IMO to zdanie jest bez sensu. Dużo osób próbuje wymyślić nowe kolekcje, a taki Goldman-Sachs ma własną bibliotekę do tego: https://github.com/goldmansachs/gs-collections

Jeśli ktoś chce się nauczyć pracy na tablicach to napisanie własnych kolekcji jest jak najbardziej OK.

0

Implementacja tego w Javie nie ma większego sensu.

Zauważ, że implementując taką strukturę danych jak lista powiązana, ktoś kto uczy się programować lepiej zrozumie idee która siedzi w 'środku' jeśli zacznie implementację chociażby w C. Java wiele rzeczy załatwia tutaj za nas(chociażby GC), więc jeśli już uczyć się implementacji struktur danych dla samej nauki, jak one funkcjonują to Jave odradzam. Oczywiście, później gdy już się co nie co rozumie implementacja swoich własnych klas implementujących interfejsy Collection/List czy inne jest jak najbardziej okey. Jak kto woli :p

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