The safer way to do this is using std::transform.
But, since inside the implementation of std::list, T=A* or T=B* behaves the same way (both have the same size), a list has same inner structure than a list. So it is possible to do the following trick:
list<B*> list2 = *( reinterpret_cast< list<B*>* >(&list1) );
Note:
My answer is informational, please stick with the std::transform approach. Also, I tested this with GCC and it works, but I am not sure if in others STDC++ implementation the list behave the same way.