Modify your else clause with :
ListObject<DT> *temp = Last;
Last = new ListObject<DT>(); Last->Back = temp; Last->Forward = nullptr; Last->Current = elem;
temp->Forward = Last;
This will fix your memory leak.
Replace also the if clause by :
if(First == nullptr) { //list is empty
First = new ListObject();
First->Current = elem;
First->Back = nullptr;
First->Forward = nullptr;
Last = First; //last IS also first, do not duplicate
return;
}
This will fix the duplicated first element.