#java #sorting #linked-list
#java #сортировка #связанный список
Вопрос:
Итак, я должен сортировать связанный список в Java по алфавитному порядку (узлы — это строки). Мне не разрешено использовать коллекции, поэтому я должен составить свой собственный связанный список и алгоритм сортировки. Я создал метод, который находит самое большое (или самое удаленное по алфавиту) слово в связанном списке, которое работает. Теперь я пытаюсь выполнить сортировку, взяв связанный список, найдя самый большой элемент и вставив его в новый связанный список. Затем он удаляет самый большой и продолжает делать то же самое, пока связанный список не станет пустым. При запуске я получаю пустой список, что не так с моим кодом?
Код, возвращающий самый большой элемент
public Link isLargest(){
Link large = first;
Link temp = null;
Link current = first;
Link after = current.next;
while (after != null){
if (large.lastName.compareTo(after.lastName) < 0){
large = after;
}
temp = current;
current = temp.next;
after = current.next;
}
return large;
}
Чтобы удалить, я устанавливаю самый большой элемент спереди, а затем удаляю его.
private static LinkedList linkSort(LinkedList unsorted){
LinkedList sorted = new LinkedList();
while (!(unsorted.isEmpty())){
Link large = unsorted.isLargest();
sorted.insert(large.name, large.lastName);
first = large;
unsorted.removeFront();
}
return sorted;
}
Комментарии:
1. К вашему сведению, в Java существует соглашение об именовании методов, так что все, что вызывается
isFoo()
, возвращает логическое значение. Если вы хотите действительно получить значение, вам нужно будет назвать свой методgetFoo()
findFoo()
или что-то в этом роде, чтобы избежать путаницы.2. Что касается вашей проблемы, ваш
linkSort()
метод выглядит так, как будто он должен добавлять что-тоsorted
, поэтому я бы предположил, что либо несортированный список, который вы передаете, пуст, либо в вашемisEmpty()
методе есть ошибка. Пробовали ли вы пошаговое выполнениеlinkSort()
в отладчике или, по крайней мере, вводили некоторые операторы ведения журнала, чтобы убедиться, что ваш цикл while выполняется?3. Я немного смущен… вам нужно создать сортированный
List
(как в названии вашего вопроса, и в этом случае вам нужно будет только переопределитьadd()
метод любого типичногоLinkedList
), или вам нужно на самом деле отсортировать некоторыеList
?4. Мне нужно отсортировать LinkedList в алфавитном порядке, что я и делаю, создавая новый отсортированный список
Ответ №1:
После того, как вы найдете самую большую ссылку, вы удаляете ссылку в заголовке (removeFront) LinkedList. Это неверно, потому что ссылка в начале не обязательно является самой большой ссылкой. Что вам нужно удалить, так это самую большую ссылку.
Комментарии:
1. Как это объясняет, почему возвращаемый отсортированный список пуст? Это должен быть комментарий, и как таковой был бы полезен, но он не отвечает на главный вопрос OPs.
2. Это не так. Это всего лишь одна из проблем, которые я вижу. Нам нужно посмотреть, как выглядит метод insert() .