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

редактировать: Я искал YouTube, Nothig там о LinkedList и кучи Когда сборщик мусора протирать temp? Я знаю, что нужно, но не могу видеть, где.Что происходит за кулисами (куча, стек и т. Д.) При добавлении узла в LinkedList?

Мне трудно понять это. Интуитивно я бы просто написать

_head = node; 

Я знаю, что это не правильно, но я чувствую, что мне нужно, чтобы понять, что там происходит с объектами и адресами, чтобы получить точку ...

первую строку: Я создайте временную точку и наведите ее на тот же адрес: _head points
секундная строка: теперь головка указывает на точки узла узла, (node.next равно head.next)
Третья строка: теперь node.next становится temp ..
am i right

+0

'_head = node;' но тогда что происходит со старой головой? Подумайте о соединении скрепки вместе. Вы не можете просто отбрасывать существующую цепочку каждый раз, когда вы получаете новый клип. Вы должны прикрепить существующую цепочку к новой скрепке. Здесь он работает так же: вам нужно привязать существующую цепочку узлов к новой голове. – computerfreaker

+0

Я это понимаю, но что происходит с кучей, и адреса. temp остается там? каждый раз, когда я использую этот метод, там остается еще одна температура? Когда он вытирается? как это работает ... –

ответ

0

Это работает следующим образом:

  1. node находится в стеке и ссылок куча-объекта (А), который вы хотите вставить
  2. _head предположительно является членом кучи-объекта (список) и ссылается на кучный объект (B), который сейчас находится во главе списка.
  3. Вы создаете ссылку temp на стек, который затем также ссылается на этот объект (B)
  4. Вы можете изменить ссылку _head к куче-объекта, на который ссылается node, так _head Теперь ссылки (A)
  5. Вы прямо сейчас (A), на который ссылаются как _head, так и node, чтобы иметь ссылку next -bember
  6. Оба (A) и (B) имеют счетчик ссылок как минимум один раз, поэтому GC не работает ни на одном.
  7. После выхода из функции восстанавливается память стека для ссылок, и объект кучи сохраняется, если на них ссылаются.
  8. После перенастройки из функции, пока ваш список все еще существует, (A) ссылается на список-лист, (B) ссылается на (A) next -member и т. Д. И т. Д. поэтому ничто не востребовано сбором мусора.
+0

Спасибо, средний Я понял, просто еще пару вопросов. - При каждом добавлении нового узла в список, все эти узлы имеют временную точку, указывающую на них? Я понимаю, что меня смутило («временное»). -Если узел и _head теперь ссылаются (A), могу ли я написать _head._next = temp; ? –

+0

Вы можете, но затем вы создаете ссылку на себя, и вы закончите цикл в процессе итерации. Вы создаете темп, чтобы сохранить ссылку на (B), в то время как вы назначаете голову точке (A).В противном случае у вас больше не будет способа найти (B). Более логичным было бы изменить последнюю строку на _head.setNext (temp). Суть в том, что вы хотите сделать, это перейти от этого (B) -> .... к этому (A) -> (B) -> ..... Ваш список довольно необычен, потому что вы проходите в списке-узле, и, таким образом, вы можете теоретически устранить temp и выполнить node.next = _head; _head = node; – midor