Как работает указатель pNext в односвязном списке
у меня возможно довольно легкий вопрос,но я не могу разобраться. Есть у меня начальная реализация однонаправленного списка List.h:
#pragma once
#include <iostream>
template <typename T>
class List {
private:
template <typename T>
class Node {
public:
Node* pNext;
T data;
Node(T data = T(), Node* pNext = nullptr) {
this->data = data;
this->pNext = pNext;
}
};
int SIZE;
Node<T> *head;
public:
List();
~List();
int get_size() { return this->SIZE; }
void push_back(T);
T& operator [](const int);
};
List.cpp:
#include "List.h"
template <typename T>
List<T>::List() {
SIZE = 0;
head = nullptr;
}
template <typename T>
List<T>::~List() {
}
template <typename T>
void List<T>::push_back(T data) {
if (head == nullptr) {
head = new Node<T>(data);
}
else {
Node<T> *current = this->head;
while (current->pNext != nullptr) {
current = current->pNext;
}
current->pNext = new Node<T>(data);
}
SIZE++;
}
template <typename T>
T& List<T>::operator[](const int index) {
int counter = 0;
Node<T>* current = this->head;
while (current != nullptr) {
if (counter == index) {
return current->data;
}
current = current->pNext;
counter++;
}
}
Main.cpp:
#include <iostream>
#include "List.h"
#include "List.cpp"
int main() {
setlocale(LC_ALL, "Ukrainian");
List<int> lst;
lst.push_back(5);
lst.push_back(10);
lst.push_back(15);
std::cout << lst.get_size() << std::endl;
std::cout << lst[2] << std::endl;
return 0;
}
Я не могу понять логику указателя pNext.Тоесть сначала список пуст,соотвественно он указывает на nullptr.Потом я добавляю елемент в список,который становиться первым и все еще указывает на nullptr,дальше я добавляю второй елемент который указывает так же на nullptr,но в какой момент предыдущий елемент меняет nullptr на адрес следующего елемента?