2016-06-16 17 views
-3
public void addToHead(IntNode node) { 
    IntNode temp = _head; 
    _head = node; 
    node.setNext(temp); 
} 

edit: Ich suchte youtube, Nothig dort über Linkedlist und den Haufen Wann wischt der Garbage Collector temp? Ich weiß es sollte, aber kann nicht sehen wo.Was passiert hinter den Kulissen (Heap, Stack, etc ..) beim Hinzufügen eines Knotens zu einer LinkedList?

Ich habe es schwer zu verstehen. Intuitiv würde ich schreiben gerade

_head = node; 

Ich weiß, es ist nicht richtig, aber ich glaube, ich muß verstehen, was da los ist mit den Objekten und Adressen auf den Punkt zu bekommen ...

erste Zeile: I erstelle eine temp und zeige sie auf die selbe Adresse die _head Punkte
Sekunden Zeile: Jetzt Kopf zeigt auf die Adresse Knotenpunkte, (node.next gleich head.next)
dritte Zeile: jetzt node.next wird temp ..
bin ich richtig

+0

'_head = Knoten;' aber was passiert dann mit dem alten Kopf? Denken Sie daran, Büroklammern zu verketten. Sie können die bestehende Kette nicht jedes Mal löschen, wenn Sie einen neuen Clip erhalten. Sie müssen die vorhandene Kette an der neuen Büroklammer befestigen. Das funktioniert hier genauso: Sie müssen Ihre bestehende Knotenkette an den neuen Kopf anhängen. – computerfreaker

+0

Ich verstehe das, aber was ist los mit dem Haufen und Adressen.? Temperatur bleibt dort? jedes Mal, wenn ich diese Methode benutze, bleibt eine andere Zeit dort? Wenn es ausgelöscht wird? wie es funktioniert ... –

Antwort

0

Dies funktioniert wie folgt:

  1. node auf dem Stapel ist und verweist auf den Heap-Objekt (A), die Sie
  2. _head einfügen wollen, ist vermutlich ein Mitglied eines Heap-Objekt (die Liste) und verweist auf das Heap-Objekt (B), das derzeit an der Spitze der Liste steht.
  3. Sie legen die Referenz temp auf dem Stapel, die dann verweist auch das Objekt (B)
  4. Sie den _head von node bezogen auf den Heap-Objektverweis zu ändern, so _head jetzt Referenzen (A)
  5. Sie jetzt Modifizieren (A), das sowohl von _head als auch node referenziert wird, um seine Referenznummer (B)
  6. zu haben Beide (A) und (B) haben eine Referenzzählung von mindestens einer die ganze Zeit, so GC läuft nicht auf einem.
  7. Nach dem Beenden der Funktion wird der Stapelspeicher für die Referenzen zurückgewonnen, und das Heap-Objekt bleibt bestehen, solange sie referenziert werden.
  8. Nach der Neuabstimmung von der Funktion, solange Ihre Liste noch existiert, wird (A) durch den Listenkopf referenziert, (B) wird durch (A) 's next -Member usw. referenziert, und so weiter, also wird nichts von der Müllsammlung beansprucht.
+0

Danke midor Ich habe es, nur noch ein paar Fragen. -Basisch jedes Mal, wenn ich einen neuen Knoten zu einer Liste hinzufüge, zeigen alle diese Knoten eine temporäre auf sie? Ich weiß, was mich verwirrt hat ("vorübergehend"). - Wenn Knoten und _head jetzt verweisen (A), kann ich _head._next = temp schreiben; ? –

+0

Sie können, aber dann erstellen Sie einen Verweis auf sich selbst, und Sie werden in einem Zyklus beim Iterieren enden. Sie erstellen temp, um einen Verweis auf (B) zu behalten, während Sie Kopf an Punkt (A) zuweisen.Sonst hättest du keine Möglichkeit mehr, (B) zu finden. Die logischere Sache wäre, die letzte Zeile in _head.setNext (temp) zu ändern. Im Wesentlichen willst du von diesem (B) -> .... zu diesem (A) -> (B) -> ..... gehen. Deine Liste ist ziemlich ungewöhnlich, weil du den List-Node passierst, und damit können Sie die temp theoretisch eliminieren und tun node.next = _head; _head = Knoten; – midor