71template<
typename Node>
72LinkedListNode<Node>::LinkedListNode() : next_node(nullptr), prev_node(nullptr)
76template<
typename Node>
77LinkedList<Node>::LinkedList() : head(nullptr), tail(nullptr), size(0)
81template<
typename Node>
82LinkedList<Node>::~LinkedList()
84 Node* node = this->head;
85 while (node !=
nullptr) {
86 Node* to_be_deleted = node;
87 node = node->next_node;
92template<
typename Node>
93template<
typename... Args>
96 Node* new_node =
new Node(std::forward<Args>(args)...);
98 if (this->
head ==
nullptr) {
99 this->
head = new_node;
100 this->
tail = new_node;
103 this->
tail->next_node = new_node;
104 new_node->prev_node = this->
tail;
105 this->
tail = new_node;
109template<
typename Node>
112 if (node ==
nullptr || !this->
size) {
119 this->
head =
nullptr;
120 this->
tail =
nullptr;
123 Node* to_be_deleted = node;
125 if (node == this->
head) {
127 this->
head->prev_node =
nullptr;
128 delete to_be_deleted;
132 if (node == this->
tail) {
134 this->
tail->next_node =
nullptr;
135 delete to_be_deleted;
139 node->prev_node->next_node = node->next_node;
140 node->next_node->prev_node = node->prev_node;
141 delete to_be_deleted;
144template<
typename Node>
147 if (node ==
nullptr || !this->
size) {
153 this->
head =
nullptr;
154 this->
tail =
nullptr;
155 }
else if (node == this->
head) {
158 this->
head->prev_node =
nullptr;
159 }
else if (node == this->
tail) {
162 this->
tail->next_node =
nullptr;
165 node->prev_node->next_node = node->next_node;
166 node->next_node->prev_node = node->prev_node;