как раз надо использовать шаблоны =)
например:
template<typename _Ty>
class item
{
public:
_Ty x;
item* next;
item* prev;
};
это раз, потом сам list аналогично:
template<typename _Ty>
class list
{
public:
item<_Ty>* first;
item<_Ty>* last;
}
ну а потом пишешь:
ну и во всех функциях поменять типы возращаемых значений и аргументов по такой же схеме =)