Я думаю, что проблема в следующем:
for ( ; temp->next_ != tail; temp = temp->next_) {
tail = temp;
}
delete temp;
tail->next_ = 0;
tail = temp должен быть после того, как вы найдете темп, который ведет к tail (т.е. вне цикла for).
Кроме того, temp = не хвост, а тот, что перед хвостом. Так что, вероятно, вам нужно:
for ( ; temp->next_ != tail; temp = temp->next_) {}
delete tail;
tail = temp;
tail->next_ = 0;