My current reverse() for my doubly-linked list looks like this:
Code:
template <typename T> void
List<T>::reverse(){
    
    if(!empty()){
    
        for(List<int>::Iterator i = begin(); i != end(); i++){
        
            push_front(*i);
        }
    
        for(int j = 0; j < size(); j++){
        
            pop_back();
        }
        
      
    }
}
At first glance it seems fine, but after a bit of testing I ran into this particularity:

It doesn't swap the head and tail pointers. This causes a bit of confusion when you look-up a value or return a specific position.

So SHOULD I swap head and tail or not?

(head ^ tail) v (!head ^ !tail) << my awful discrete math class...