Отслеживание бесконечной рекурсии
Проблема, с которой вы сейчас столкнулись, заключается в том, что сортируемый в списке узел не удаляется.
Давайте посмотрим наПример ввода, который вы предоставили:
Input: 3000 400 40 120 70
В начале top
указывает на узел 3000
.В inSort
, next
устанавливается в точку, где top
указывает, а 3000
- значение для вставки.
При вызове ordInsert
, начальное условие
while(next!=null && next.getData()<newItem)
равно никогда true, потому что next.getData()
всегда равно newItem
(это тот самый объект, который вы пытаетесь повторно вставить!).Как следствие, узел top
воссоздается и вставляется в верхнюю часть, а top
соответственно устанавливается там.Таким образом, список теперь:
3000 3000 400 40 120 70
с top
, указывающим на первый элемент.
, поскольку next
является ссылкой на тот же объект, что и top
, * 1036Ссылка * s теперь установлена на 3000
рядом с ней.И вы попадаете в ту же ситуацию, что и раньше, другой элемент предшествует только списку.
Повторный вызов inSort()
будет повторять этот процесс бесконечно, чтобы получить результат
3000 3000 ... 3000 400 40 120 70
Проблемы
- Вставляемые элементы не удаляются, что приводит к расширению списка
- Сброс
top
в inSort
делает недействительнымипредпосылка для цикла while в ordInsert
.
Предлагаемое решение
Метод ordInsert
работает, только если список, в который вставляется новый элемент, уже отсортирован.Итак, стратегия должна быть такой:
1. Detach element at index 0
2. Sort remaining list
3. insert detached element into sorted list
Таким образом, сначала сохраните ссылку на верхнюю часть списка, затем переместите маркер top
на следующий элемент и установите для отсоединенного (предыдущий верхний) элемента значениеуказать на null
.Это не сделает недействительной предпосылку цикла while, поскольку top
все еще ссылается на верхнюю часть списка (элемент с индексом 0 был удален из списка).
Затем позвоните inSort()
из сокращенного списка.После успешного вызова используйте ordInsert()
для вставки отдельного элемента.Лучше всего заставить его работать с IntNode
, а не создавать совершенно новый элемент.
Для рекурсии работайте, утверждая, что top
ссылается на начало списка (укороченный [после отсоединения] или расширенный [после повторной вставки]), так что для любого шага рекурсии состояние программы будет действительным.И остерегайтесь базового случая, когда top == null
.