Можем ли мы создать узел без указателя ...
Технически да, но практически нет.Не в этом случае.
SinglyLinkedListNode nnode;
завершается сбоем, потому что не существует конструктора для SinglyLinkedListNode
, который не принимает параметров.
SinglyLinkedListNode nnode(data);
или
SinglyLinkedListNode nnode{data};
call SinglyLinkedListNode(int node_data)
и создайте SinglyLinkedListNode
, но эта SinglyLinkedListNode
является локальной переменной автоматической области действия.Он будет уничтожен, как только вернется insertNodeAtHead
.Это бесполезно для вас.Вы бы получили то, что называется висящим указателем, указателем на мертвый объект.Доступ к этому мертвому объекту - неопределенное поведение.Это часто смертельно, но, верьте или нет, хуже, когда не смертельно.Вы не знаете, что произойдет.Часто программа выглядит так, как будто она работает.И вдруг это не так.
Вам нужно динамическое выделение, а самый простой способ удержать динамическое выделение - с помощью указателя.
Примечание:
return llist = nnode;
также может быть
return nnode;
, назначение здесь ничего не делает.Указатель - это адрес объекта.Когда вы передаете указатель в функцию, указанный объект передается по ссылке, но функция получает копию адреса.llist = nnode
изменяет копию адреса, а не оригинал.Вызывающая функция не имеет представления о том, что происходит с копией, и продолжает работать с ее исходным значением.
В этом случае вам отчасти повезло, потому что
return llist = nnode;
выполняет бессмысленное назначение изатем возвращает значение llist
, значение, которое вы все равно хотели вернуть.