Ваш алгоритм не работал, потому что второй цикл всегда go повторяет (почти) весь список снова и снова. Что он должен сделать, это только go через оставшуюся часть. Т.е. второй цикл должен быть:
for (it2 = std::next(it1); it2 != numbers.end(); ++it2)
Также, поскольку второй цикл начинается со «следующего» элемента, первый цикл должен go не до последнего элемента, а до второго до последнего элемента. Т.е. что-то вроде этого:
for (it = numbers.begin(); it != std::prev(numbers.end()); ++it)
НО, поскольку std::prev()
определено только для двунаправленных итераторов, а std::list
не предоставляет один, его, вероятно, проще переписать как:
for (it = numbers.begin(); std::next(it) != numbers.end(); ++it)