#java #sorting #linked-list
#java #сортировка #связанный список
Вопрос:
Привет всем. Я надеюсь, что кто-то может пролить немного света на это. У меня есть проблема с домашним заданием, которая просит меня отсортировать данный LinkedList и вернуть отсортированный список следующим образом:
private LinkedList<T> list;
// constructor
public SortedLinkedList(LinkedList<T> in){
}
Теперь, я думаю, у меня есть логика (я мог бы использовать простую сортировку слиянием), но я не вижу способа получить доступ к самим узлам. Что-то, что приходит на ум, — это также небольшая вариация быстрой сортировки, т. Е. Используйте head в качестве опоры и сортируйте linkedlist на два меньших, повторяя, а затем объединяя… но я хотел знать, могу ли я сделать это другим способом. Однако, поскольку мы не можем получить доступ ни к одному из частных узлов, у меня нет хороших идей.
Нам не разрешено использовать коллекции или массивы для сортировки по понятным причинам. Нам разрешено использовать только Java LinkedList и единственное личное поле.
Спасибо за любой вклад.
Редактировать: я бы предпочел избегать использования toArray, если смогу помочь.
Ответ №1:
Поскольку вам не разрешено использовать другие классы, я бы рекомендовал вам использовать пузырьковую сортировку. Это проще, а производительность не так уж и плоха. Вот как это использовать:
public SortedLinkedList(LinkedList<T> in) {
bubbleSort(in);
}
private void bubbleSort(LinkedList<T> in) {
// Convert the LinkedList into an array called arr. You should know how to do this..
// This code assumes that your resulting array is of type int. For others, adjust
// the code appropriately.
for(int i = arr.length - 1; i > 0; i--) {
for(int j = 0; j < i; j ) {
if(arr[j] > arr[j 1])
swap(array, j, j 1);
}
}
}
private void swap(int[] array, int i, int j) {
int temp = 0;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
Комментарии:
1. На самом деле, это было не совсем то, что я искал. Я должен был указать на это в начале, но я пытаюсь стремиться к чему-то более эффективному. Моим единственным мозгом было (есть), как получить доступ к ссылкам / данным узла без использования toArray. Я не могу использовать итератор, так как это вызвало бы у меня приятное ConcurrentModificationException .
2. Затем вы можете попробовать использовать сортировку по вставке, поскольку она сортирует элементы во время их вставки. Так что это должно быть более эффективно. Подробнее об алгоритме читайте в статье Википедии.
3. Я бы так и сделал, но суть кода не в этом. Предполагается, что он возьмет существующий LinkedList и отсортирует его.
4. Извините, тогда у меня закончились идеи. 🙂 Но для вашей другой проблемы использование итератора не должно вызывать исключения (я сделал это и не получил исключения). Выполните итерацию по списку, добавляя каждый элемент в массив.
Ответ №2:
Все в порядке, вам не нужен никакой частный доступ. Используйте список как просто список — у вас есть методы get и set.
Однако очень важно учитывать, что связанный список имеет медленный произвольный доступ! Итак, вам нужно найти сортировку, которая работает с узлами, расположенными рядом друг с другом.
Что-то вроде сортировки пузырьков на самом деле может сработать лучше всего в этом случае. Не пузырь . . Название было другим, вам нужно cmp и поменять местами соседние ячейки. Может быть, поменять местами?