Связанный список использует ссылки для создания структуры списка.
Ключевым моментом является понимание различия между value и reference типами в C #.Типы значений, такие как int
, bool
или struct
, действительно являются значениями, которые хранятся в стеке, и когда вы присваиваете их, вы фактически копируете данные из одного местоположения в другое.Типы ссылок classes
в C #, и различие в том, что они просто указатели на данные в куче памяти.По умолчанию это null
, и сначала вы должны выделить для них память в куче, чтобы они фактически указывали куда-то, используя new
.
В этом случае у вас есть поле типа Node
в качествеСвойство класса Node
, что хорошо, потому что это либо просто null
, либо оно указывает на другое место в куче памяти, где хранится следующий узел.Если вы изменили class
на struct
, это не скомпилирует, так как это вызовет "рекурсивную" проблему, о которой вы упоминаете.Но с классами это просто ссылка, и значением по умолчанию является null
, поэтому ему не нужно указывать на экземпляр , а создание экземпляра Node
создает только один экземпляр Node
в памяти,с next == null
.
Это должно помочь вам понять и второй вопрос - установка next = head
означает, что вы просто указываете next
на то же место, которое head
указывает в памяти.Вы не перемещаете какие-либо данные, вы просто устанавливаете ссылку.
Я считаю полезным использовать изображения при построении алгоритмов связанного списка.Вы можете представить каждое поле next
как стрелку, указывающую куда-то.И когда значение null
, оно просто указывает "никуда".Наконец, когда вы назначаете что-то для next
, вы просто меняете место, куда указывает стрелка.