Существует простой способ со сложностью O (n ^ 2): просто итерируйте по каждой записи массива с самого начала и ищите в массиве последнее идентичное значение. Если он находится в той же позиции, что и ваша текущая позиция, двигайтесь дальше. В противном случае удалите последовательность (кроме начального значения) и продолжайте. Вы должны быть в состоянии реализовать это, используя два вложенных цикла for и условный memcpy.
Существует более сложный способ, имеющий сложность O (n log n). Если ваш набор данных большой, он предпочтительнее для производительности, хотя его сложнее реализовать и, следовательно, он более подвержен ошибкам.
1) Сортировка массива - это часть O (n log n), если вы используете хороший алгоритм сортировки. Сделайте это по ссылке - вы хотите сохранить оригинал. Это перемещает все одинаковые значения вместе. Разбейте порядок сортировки по позиции в исходном массиве, это поможет на следующем шаге.
2) Выполните итерацию один раз над отсортированным массивом (O (n)), ища прогоны с тем же значением. Поскольку эти прогоны сами сортируются по положению, вы можете тривиально найти каждый цикл, включающий это значение, сравнивая соседние пары на равенство. Сотрите (не удалите) каждый цикл из исходного массива, заменив каждое значение, кроме последнего, на часовой (нулевой может работать). Пока не закрывайте пробелы, иначе ссылки разорвутся.
NB. На этом этапе вам необходимо игнорировать любые конечные точки, которые уже были удалены из массива. Поскольку они разрешаются для дозорных, вы просто должны быть осторожны, чтобы не стереть «прогоны», связанные со значением дозорного с обоих концов.
3) Удалите отсортированный массив и используйте часовые, чтобы закрыть пробелы в исходном массиве. Это должно быть O (n).
Фактически реализация этого на любом данном языке оставлена как упражнение для читателя. : -)