Java удалить узел из связанного списка по ссылке

1

Как эффективно удалить узел из java LinkedList по ссылке на объект или на конкретный узел? использование remove (object) использует обход по всему списку, о чем свидетельствует документация: "удаляет первый элемент e такой, что (o == null? e == null: o.equals(e))". Можно ли удалить конкретную ссылку на узел? Я не возражаю хранить ссылку на узел в самом объекте. Я не могу использовать индекс списка, поскольку он может измениться. Если нет, есть ли другая структура данных, которая позволила бы мне это сделать?

  • 0
    По сути, вы хотите указатель для ваших узлов?
  • 0
    Ваш собственный связанный список? Встроенный LinkedList ? Если ваш собственный, это зависит от того, как вы это реализовали. Что вы пробовали? Можете ли вы опубликовать соответствующий код и описать возникшую проблему? Что касается других структур данных, это зависит от ваших требований. Вы должны быть более конкретными.
Теги:
data-structures
linked-list

2 ответа

2
Лучший ответ

Попробуйте использовать LinkedHashSet. Это в основном HashSet с детерминированным порядком его элементов. Или, альтернативно, вы можете просмотреть его как LinkedList поддерживаемый с помощью таблицы поиска элементов.

Я считаю, что операция remove(Object) будет постоянной.

  • 0
    Спасибо, это очень близко к тому, что я хочу. Тем не менее, хэширование все еще выглядит как обходной путь, когда я хотел бы получить прямой доступ по ссылке.
  • 0
    HashSet не допускает дублирования. Вы можете определить свой метод equals и hashCode, помня об этом. Вы также должны позаботиться о начальной емкости, если производительность взаимодействия имеет решающее значение
2

Вы можете использовать HashSet

Удаление, вставка в целом в постоянное время, как указано официальным API:

Этот класс предлагает постоянную производительность по времени для основных операций (добавление, удаление, наличие и размер), предполагая, что хеш-функция правильно распределяет элементы среди ковшей

Если вы решите использовать HashSet, не забудьте переопределить оба метода equals AND hashcode в вашем объекте.

  • 0
    Я рассматривал HashSet, но мне нужно сохранить порядок вставки. Кроме того, хеширование выглядит как обходной путь, когда я хотел бы получить прямой доступ по ссылке.
  • 0
    в этом случае, как ответил @tskuzzy, вам понадобится LinkedHashSet . Но хеширование - это не «обходной путь»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню