Может возникнуть путаница, если в пустом MyLinked List
есть узел, даже если это просто узел с null
prev
, next
и данными, поэтому вам следует быть осторожным с этим конструктором MyLinkedList
-вероятно, было бы намного проще, если бы он просто читал head = null;
.
Также было бы полезно, если бы MyLinked List
имел также узел tail
, чтобы спасти вас по цепочке до конца, чтобы найти, гдеadd
должен поставить новый Node
.
После этого, я думаю, проблема в том, что вы не заметили, что вам нужно два цикла: один для прохождения по списку, чтобы отслеживать, где находитсяначинаются несортированные узлы, и один из них находит наименьший из них узел.Вам также нужно написать swap
метод для Node
, чтобы вы могли написать что-то вроде непроверенного псевдокода , который очень похож на Java
for (index = head; index != null; index = index.getNext()) {
min = index;
for (test = min.getNext(); test != null; test = test.getNext) {
if (test.getLine().compareTo(min.getLine()) < 0)
min = test;
}
if (min != index) {
swap(index, min);
index = min;
}
}
и swapбудет выглядеть примерно так:
public void swap(Node other)
{
Node temp;
temp = next;
next = other.getNext();
other.setNext(temp);
temp = prev;
prev = other.getPrev();
other.setPrev(temp);
other.getNext().setPrev(this);
other.getPrev().setNext(this);
this.getNext().setPrev(other);
this.getPrev().setNext(other);
}
Обратите внимание еще раз это полностью не проверено и даже не видел компилятор.
Обязательно подумайте об особых случаях, например, когдасписок пуст или содержит только один элемент, и когда в списке остается только один узел, не отсортированный в списке.
Я не мог оставить это, не указав, что swap
на самом деле многоболее сложный, чем это.Я добавил несколько строк, чтобы исправить указатели в узлах до и после заменяемых узлов.Вам также необходимо учитывать:
находится ли какой-либо из переставляемых узлов в конце списка, в этом случае head
(и tail
, если у вас есть один) списка необходимо будет обновить вместо указателей на соседних узлах.Это довольно очевидно.
Независимо от того, находятся ли подлежащие обмену узлы рядом друг с другом в списке, когда при применении нормального алгоритма вы получаете узлы, указывающие на себя.Это менее очевидно.