линейный односвязный список pop, push_front
Вот уже который день страдаю погружением и изучением ООП на С++. Решил написать односвязный список и вроде как получилось, но есть много вопросов. Подскажите, пожалуйста, как можно улучшить данный блок кода -
template<typename T>
void List<T>::push_front(T data)
{
if(head == nullptr)
{
head = tail = new Node(data);
}
else
{
Node* current = new Node();
current->_pNext = head->_pNext;
head->_pNext = current;
current->_data = head->_data;
head->_data = data;
Size++;
}
}
Все никак не мог придумать, как более логично/эффективно вставить узел в начало, по этому решил просто -
- Создавать новый узел - current
- В current->_pNext присваивать адрес следующего узла из поля head->_pNext
- Поле _data с head присваивать новому узлу
- Аргумент (T data) вставлять в head
Также не понимаю как организовать удаление узлов с конца, это нужно находить перебором адрес предпоследнего узла ?
Ответы (1 шт):
Вашим головным элементом должен быть только созданный элемент, значит head должен указывать на него, а его следующим элементом должен быть тот, на который указывал head до добавления. А хвост остается на своем месте, и только в том случаи, когда список был пустым хвост является также головой. Теперь напишем выше сказанное:
Node* current = new Node;
current->_pNext = head;
head = current;
head->_data = data;
if (tail == nullptr)
tail = head;
++size;
Нужно всегда обеспечивать, чтобы head указывал на первый элемент, а tail на последний(голова и хвост), тогда, чтобы удалить последний, нужно начиная от головы найти элемент, находящийся перед tail и поставить tail на него, а тот элемент, на который указывал tail, удалять.