У нас есть классические узлы со ссылкой на следующий узел и список, имеющий заголовок (последний добавленный элемент) и последний элемент, не содержащий ссылки.
Мы должны реализовать вариант «Частота», который должен упорядочивать список по тому, сколько раз к элементу обращались с помощью вызова метода add/contains().
Итак, если список равен 1, 2, 3, 4, где 1 является заголовком, и мы вызываем contains(3), список меняет свой порядок на 3, 1, 2, 4, так как 3 был вызван один раз, а остальные элементы 0 раз.
В проекте уже реализованы методы увеличения частоты, геттер для нее, метод getHead() и метод getNext()
public class SetFC extends SetNaive {
public boolean contains2(final E element) {
if (element == null) {
return false;
}
Node current = getHead();
Node prev = null;
while (current.getNext() != null) {
// if the element is already at the beginning, no need to change anything
if (current.equals(getHead())) {
return true;
}
// element found
if (current.getElement().equals(element)) {
// increase the frequency of this element
current.incFrequency();
// if current has no next, prev cant hold a reference to any element
if (current.getNext() == null) {
// set prev.next to null since its end of the list
prev.setNext(null);
// set current.next to (the previous) head of the list
current.setNext(getHead());
// set current to be the new head
setHead(current);
}
// the element is somewhere in the middle (start and end is handled)
else {
// link the previous element to the next
prev.setNext(current.getNext());
// same procedure as before
current.setNext(getHead());
setHead(current);
}
// reset prev to use it from the beginning
prev = null;
// now we prepared the arrangement by putting the found element at the start of the list.
// we now need to swap it with its successor as long as its frequency is smaller than it
// (and the next element is not null)
while (current.getFrequency() < current.getNext().getFrequency() && current.getNext() != null) {
// this part idk what to do, Im pretty sure the rest has errors too
}
return true;
}
prev = current;
current = current.getNext();
}
return false;
}
}
этот метод всегда вызывается
public void add(final E element)
{
if (element == null) {
throw new NullPointerException();
}
else if (!contains(element)) {
addToList(element);
}
}
в классе Set (варианты наследуются от SetNaive, который является подклассом Set
Чего мне не хватает?
edit:
Если вы хотите увидеть, это был цикл while в предыдущей попытке:
while (current.getFrequency() < current.getNext().getFrequency()) {
prev.setNext(current.getNext());
prev = current.getNext();
current.setNext(current.getNext().getNext());
prev.setNext(current);
}