Основная проблема с вашим кодом заключается в том, что он ведет себя неправильно, когда узел уже находится в позиции, которой он должен быть.Если мы выполним с:
5 -> 1 -> 2 -> 3-> 4
prev
будет нулевым, и мы потерпим крах.
Если мы сделаем с:
1 -> 4 -> 5 -> 3-> 2
на первой итерации вы получаете
5 -> 4 -> 1 -> 3-> 2
Пока все хорошо. И затем, после цикла второй итерации
5 -> 4 -> 3-> 2
// предыдущая все еще указывает на 4, 1 исчезает
5 -> 4 -> 4
. // tempMax = toHere, так что tempMax-> tempMax и другие элементы пропали
Таким образом, проявление заключается в том, что prev
в некотором роде недопустим.Существует быстрое исправление, например, пропуск позиции, когда toHere
- максимум, но быстрые исправления - это не то, что вам нужно.Вы должны:
- Переосмыслить о некоторых особых случаях.Пустой список, один элемент, список уже отсортирован, список отсортирован в обратном порядке, в случайном порядке, (дублирующий элемент ??)
- Записать модульный тест для каждого случая
- Переписать свой алгоритм и избежать О, да, я забыл дело ... .Если вы не согласны, вам нужно всего лишь заменить первый элемент на каждом шаге на максимум, найденный на этом шаге.
- Избегайте переменных, которые имеют избыточную информацию.Например,
tempMax
всегда должно быть следующим за prev
, поэтому достаточно только prev
.В противном случае вы тратите клетки мозга, сохраняя согласованность. - Проверьте еще раз набор.