Чтобы предотвратить переполнение стека, создайте два счетчика, скажем, имена left_counter и right_counter.Во время шагов раздела обновите счетчики так, чтобы left_counter = количество узлов от первого до pivot или pivot.prev, а right_counter - количество узлов от pivot или pivot.next до последнего.Сравните два счетчика и используйте рекурсию в подсписке, который соответствует меньшему количеству.Затем обновите first = pivot.next или last = pivot.prev в зависимости от того, какая часть была отсортирована (с помощью рекурсии) и вернитесь к началу кода для продолжения.
Во время сортировки может произойтиПроще создать круговой двусвязный список, чтобы first.prev указывал на последний узел, а last.next - на первый узел.Это избавило бы от необходимости выполнять проверку на нулевые значения при замене узлов на или рядом с первым или последним узлом.
Код показывает использование типа класса с именем List, но обычно это собственный класс для C # с возможностьюиндексировать (произвольный доступ) элементы в «списке», аналогичном массиву.Вероятно, следует использовать другое имя для класса списка, например, «DLList» для двусвязного списка.