При попытке удалить в al oop ваша циклическая ссылка приведет к удалению памяти и будет иметь неопределенное поведение. Итак, сначала подумайте о нарушении циркуляции:
tail->next = 0;
Затем удалите в al oop
Node* p = head;
while(p)
{
Node* temp = p;
p = p->next;
delete temp;
}
Кстати. tail-> next всегда будет указывать на голову. Таким образом, у вас всегда будет и голова, и хвост в одном указателе. Так что очистить память можно так:
Node* p = tail->next; //this is head
tail->next = 0;
while(p)
{
Node* temp = p;
p = p->next;
delete temp;
}