Najbardziej elementarna lista jednokierunkowa i jej problem

0

Mamy coś takiego:

class Node {

    Node next = null;
    int data;

    public Node(int d) {
        data = d;
    }

    void appendToTail(int d) {
        Node end = new Node(d);
        Node n = this;
        while (n.next != null) {
            n = n.next;
        }
        n.next = end;
    }
}

Cytując z książki:

What if multiple objects need a reference to the linked list, and then the head of the linked list changes? Some objects might still be pointing to the old head

Zastanawiam się dlaczego może dojść do takiej sytuacji skoro wszystkie parametry są przekazywane przez wartość. Więc jak utworzę sobie obiekt head w/w klasy (dodam sobie np. 2 elementy przy pomocy appendToTail), a następnie stworzę kilka innych obiektów (np. A, B i C) do których przekażę wartość referencji do obiektu head to dlaczego miałoby dojść sytuacji gdzie jeden z obiektów A,B,C ma referencję do nieaktualnego początku listy skoro z definicji mają referencję do head ?

0

Twój opis jest bardzo mętny (to gdzie mówisz (np. A, B i C) do których przekażę wartość referencji do obiektu head jest dla mnie mega nie jasne).

Nie mniej, jednym z zamysłów listy jednokierunkowej jest to żeby można było usuwać z niej elementy, nie ważne czy z początku (Twój head), końca (Twój tail) czy ze środka.

Więc jasne, że jeśli masz referencję do jakiegoś obiektu (który akurat teraz jest headem, tailem albo jest w środku), to wcale to nie oznacza że zawsze będzie, bo lista może się zmienić. Może zostać dodanych/usuniętych więcej elementów. Łacznie z elementem do którego masz referencję.

PS: Java ma bardzo dużo już wbudowanych kolekcji, jedną z nich jest LinkedList, czemu z nich nie skorzystać?

1

jesteś pewny, że to zdanie jest związane z kodem, który podałeś? Aby odpowiedzieć czy jest w ogóle taka sytuacja możliwa musiałbyś podać większy kod - tam gdzie masz to co opisujesz na samym końcu.

1

Twoja lista to liniowy łańcuch elementów: head -> elem2 -> elem3 -> ..., w którym każdy ma referencję do następnego. Mając referencje do head Masz dostęp do calej listy. Jeśli jakieś dwa obiekty mają ten dostęp i pierwszy doda element na początku(czyli "stary" head będzie teraz drugim elementem), albo usunie head, to drugi będzie dalej tą samą referencję i nie będzie ona juz referencją do head, czyli w programie jest bug. W imperatywnych językach, jak np., Java, tworzy się obiekt LinkedList, który jako swoje pole prywatne ma strukturę node i sprawa załatwiona, ten główny obiekt przejmuje, poprzez metody publiczne, komunikację ze światem i on zmienia (jak potrzeba) swoje pola prywatne, zapobiegając inkryminowanej sytuacji.

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