Usuwanie przedmiotu z linkedlist

0

Witam
Nie rozumiem na jakiej zasadzie usuwany jest item z linked list w poniższym kodzie, szczególnie w miejscu else, gdzie Copmarision ==0. Jest to nadpisane metoda z Interfejsu.

@Override
    public boolean removeItem(ListItem reitem){
        if(reitem !=null){
            System.out.println("Deleted item "+ reitem.getValue());
        }
        ListItem currentItem = this.root; //zaczynamy od głowy
        while(currentItem !=null) {
            int RemoveComparasion = currentItem.CompareTo(reitem);
          
            if (RemoveComparasion == 0) {
                if (currentItem == this.root){    
                this.root = currentItem.next(); //ustawiamy nowy korzeń (głowe)

            } else {
                currentItem.previous().setnext(currentItem.next());                                
                if (currentItem.next() != null) {                                                                   
                    currentItem.next().setPrevious(currentItem.previous());                    
                }
            }
            return true;

        }else if(RemoveComparasion<0){
            currentItem=currentItem.next();
            }else{
                 return false;

            }
        }
     
        return false;
    }

Interfejs

public interface NodeList {
    ListItem getRoot();
    boolean addItem(ListItem item);
    boolean removeItem(ListItem item);
    void traverse(ListItem root);
}
0

Linked list działa jak w C++ lista na wskaźnikach z tą różnicą, że wywalony element zostanie posprzątany przez garbage collector.

Jeśli cmp == 0, to znaczy, że znaleziono element do usunięcia. Jeśli znaleziony element jest elementem pierwszym (root), to ustawiamy następny element jako pierwszy i do obecnego elementu (który przed chwilą był pierwszy) nie ma już referencji w liście. Jeśli element listy nie jest pierwszy to poprzedni element listy łączymy z następnym elementem, pomijając obecny element, który w tym momencie traci referencję.

Moim zdaniem dla pewności powinno się jeszcze przy ustawianiu nowego roota, zmienić jego previous na null:
currentItem.next().setPrevious(null);

Popraw kod, bo poziomy zagnieżdżenia się nie zgadzają...

0

Linked-list-remove.jpg

Dzięki za odpowiedź nie bardzo jednak rozumiem nadal jeden zapis: currentItem.previous().setnext(currentItem.next()). Zrobiłem na szybko także schemat w paincie aby zobrazować jak ja to rozumiem.
CurrentItem(Warszawa), ustawiamy. previous(), czyli sprawdzamy, czy jest poprzedni element w kolejce(zwróci 8) bo iteracyjnie taki adres w pamieci RAM ma ta komórka. Następnie od Warszawy idziemy w prawo i ustawiamy jako setnext(na Łódź), która iteracyjnie jest jak next od CurrentItem(Warszawy)?
Dobrze rozumiem ten zapis?

2

Dobrze. Robisz połączenie między Zakopanem i Łodzią, pomijając Warszawę.

A co do adresów w pamięci RAM, to raczej nie wchodź w ten temat jak będziesz tłumaczył działanie. Elementy listy mogą być porozrzucane po pamięci. Dlatego każdy element ma adresy innych elementów.

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