Java-связанные списки, создание безымянных узлов - PullRequest
0 голосов
/ 11 июня 2018

мой вопрос, возможно, слишком прост: возможно, по этой причине мне не удалось найти письменный ответ.я пытаюсь понять, как создаются связанные списки, и есть одна вещь, которую я не могу понять: обычно, когда я создаю объект некоторого класса, мне нужно дать ему имя, например:

 cat kitten =new cat();

в то же время, когда я делаю это, компьютер дает ему адрес, что-то вроде dfe @ fggv3444.Когда я хочу использовать созданный объект в каком-либо методе, я обращаюсь к нему по названию, которое я ему дал: в нашем случае: «cat».логика заключается в том, что если я назову 2 объекта с одним и тем же именем «кот», компьютер не будет знать, к какому объекту обращаться, или, возможно, к обоим.и теперь вопрос: когда мы используем связанный список, количество используемых узлов сильно меняется во всей программе.так как эти объекты типа класса узла получают свои имена?очевидно, у них должно быть имя, но я не для того, чтобы дать каждому узлу свое имя ...

как это работает?!

спасибо заранее.я уверен, что что-то в этом вопросе должно быть глупо, но не могу понять, что.

Ответы [ 5 ]

0 голосов
/ 11 июня 2018

Имя переменной только для удобства чтения.Компилятор Java переводит исходный код в «машиночитаемый» код, который не содержит имени переменной.Значения хранятся в памяти с определенными адресами, такими как 0x00000000 в шестнадцатеричном формате.

Каждый узел содержит значение и адрес памяти следующего узла.Когда вы вызываете cat.next();, ваш компьютер получает адрес следующего узла вместо имени переменной и знает, где находится этот адрес.

Примечание:

  1. Значения также могут храниться в регистре, кэше или на диске.Они также ссылаются на адреса для данных.
  2. Java LinkedList на самом деле является двусвязным, где каждый узел также содержит адрес своего предыдущего узла.Мы используем односвязный список для упрощения.
0 голосов
/ 11 июня 2018

Вы не можете присвоить одно и то же имя любым двум переменным в Java в пределах одной и той же области видимости (хотя обе переменные все еще существуют и не удаляются сборщиком мусора Java. Дополнительная информация: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html), в противном случае компиляторне будет знать, на какое значение или объект вы ссылаетесь.

Чтобы ответить на вторую часть вашего вопроса, объект существует до тех пор, пока у него есть ссылка (способ доступа кобъект). Вы правы, понимая, что очевидно, что к объекту, добавленному в связанный список, потребуется доступ. Предположим, что первый узел назван заголовком, и вы должны найти ссылку на третий узел в связанном списке.next.next будет ссылкой на третий узел в связанном списке, он не обязательно должен иметь имя типа 'head', но будет существовать до тех пор, пока у него есть ссылка.

Надеюсь, что это ответваш вопрос!

0 голосов
/ 11 июня 2018

Каждое cat имя по существу (как указал @ Turing85 в комментариях) просто адрес памяти для экземпляра cat в удобочитаемом формате.

Связанный список в своей основе представляет собой набор узлов, каждый из которых имеет value и узел next (next - это переменная, которая соединяет узлы для формирования списка).Каждый кот будет называться просто node.value, где value - это «имя», указывающее на адрес кота узла.Переменная next каждого узла указывает на следующий узел, который имеет свой собственный value.

Вы не можете называть два объекта одинаковыми в одной и той же области видимости - вы можете иметь cat1 и cat2 оба типа cat, и каждый указывает на адрес памяти другого cat.Связанные списки могут сделать это потому, что каждый узел имеет свою собственную область, которую не видит ни один другой узел.Следовательно, все узлы могут иметь next и value, называемые node.next и node.value.

      node1        +--------> node2        +--------> node3
+--------------+   |    +--------------+   |    +--------------+
| value = cat1*|   |    | value = cat2 |   |    | value = cat3 |
| next = node2-|---+    | next = node3-|---+    | next = null  |
+--------------+        +--------------+        +--------------+

*---> cat1
+--------------+
| name = "tom" |
| col = "grey" |  ...and likewise for the other nodes
| ............ |
0 голосов
/ 11 июня 2018

В связанном списке каждый элемент представлен узлами.Эти узлы удерживают другие элементы своими адресами в памяти.Это может быть псевдонимом, но на самом деле это просто способ представить, где он находится в памяти.

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

Animal cow = new Animal();

В этом случае мы присвоили адрес данных нового объекта впеременная cow.Это позволяет нам легко получить к нему доступ.

В отличие от этого, объекты узла связанного списка содержат адрес следующего узла, но, как и любой другой объект, они содержатся как атрибут этого узла.

0 голосов
/ 11 июня 2018

Java имеет встроенный класс для связанных списков java.util.LinkedList Когда вы создаете экземпляр этого объекта, т. Е.

LinkedList<Node> list = new LinkedList<Node>();

Вы создаете ссылку , илив вашем случае name"список" объекта (вашего связанного списка)

Весь список имеет имя "list", которое может служить отправной точкой для вашего обхода.Для каждого узла в связанном списке нет «имен».В Java вы можете просмотреть список, похожий на массив;через индекс.

list.get(someIndex)

Этот метод в основном пересекает список до someIndex и возвращает узел там.Вы можете вручную установить имя для этого узла, выполнив:

Node node = list.get(someIndex)

Но, как правило, они не имеют «имени», вместо этого вы можете получить к ним доступ через их индекс илимногие другие методы.

Проверьте https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html для получения более подробной информации о встроенном классе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...