Связанный список Java: удаление самого большого элемента с помощью итератора

#java #list #linked-list #iterator

#java #Список #связанный список #итератор

Вопрос:

как я могу удалить самый большой элемент из linkedlist в java? Я знаю, что могу использовать функции get () или remove () для извлечения / удаления элементов. Но я хочу сделать это эффективным. Я хочу использовать итератор. У вас есть какие-либо идеи, как я могу это сделать? Обратите внимание, что я не хочу создавать свой собственный linkedlist. Я даже не хочу сортировать свой linkedlist.

Могу ли я выполнить линейный поиск для этого? Если да, то как я могу отслеживать указатель (или итератор), который указывает на самый большой элемент. Любая помощь будет оценена.

Ответ №1:

Связанный список (если он не отсортирован) — не лучшая структура для того, что вы пытаетесь здесь сделать, поскольку у вас нет другого выбора, кроме как выполнить линейный поиск и удалить самый большой элемент

 Integer biggest = Integer.MIN_VALUE;
for(Integer e : myList){
   if(biggest < e)
        biggest = e;
}
myList.remove(biggest);
  

это было бы O (n), даже если вам придется сканировать снова, чтобы удалить самый большой, этого второго сканирования можно было бы избежать, если бы вы создали свой собственный LinkedList, потому что java.util.LinkedList скрывает свой класс ввода и не позволяет изменять указатели; но это был бы неправильный способ оптимизации, потому что если вместо этого вы используете структуру, подобную куче, в java, которая была бы классом PriorityQueue , вы могли бы получить O (log (n)) и сократить код до:

 return myPriorityQueue.poll();
  

Ответ №2:

если вы знаете, какой самый большой элемент, вы можете сделать это следующим образом

 Iterator<Integer> it = list.iterator();
Integer toRemove;
while(it.hasNext()){
    if(toRemove.compareTo(it.next()==0){
       it.remove();
       break;
    }
}
  

или используйте list.removeFirstOccurrence (удалить)

но реализации LinkedList не позволяют копировать итераторы, указывающие на определенные элементы для последующего удаления