Swoją drogą, jeśli już używasz kontenerów biblioteki standardowej, lepiej do większości zastosowań przerzucić się na std::vector.
list<int> mylist;
vector<int> vec;
Swoją drogą [2], skoro już używasz kontenery zarządzające pamięcią, zamiast ręcznego alokowania new[n], można to też zastąpić kontenerem:
tab = new list<int>[n];
// ->
vector<list<int>> tab(n); // albo
vector<vector<int>> tab(n);
W każdym razie, do sedna. Dla uproszczenia zignoruję tablicę i usunę z `mylist`.
for (auto it = mylist.begin(); it != mylist.end(); )
{
if (*it == val)
it = mylist.erase(it);
else
++it;
}
Z iteratorami trochę trudno się to czyta, fakt.
Natomiast jeśli chcesz usunąć tylko jeden element (albo wiesz, że będzie tylko jeden), to wystarczy std::find z biblioteki <algorithm>:
auto it = std::find(mylist.begin(), mylist.end(), val);
if (it != mylist.end())
mylist.erase(it);
Do usunięcia wielu elementów można też użyć takiego magicznego one-linera:
mylist.erase(std::remove(mylist.begin(),mylist.end(),val),mylist.end());