, как указывал stargazer, абстрагирующий класс с двумя структурами данных - это один из способов сделать это. Однако есть некоторые соображения.
когда вы выводите значение, у вас также будет ключ? если нет, то удаление его из хэш-карты будет сложной операцией (не O (1)). возможно, стоит сохранить ключ каждого объекта в этом объекте, если это будет основной способ вывода данных.
при удалении значения из таблицы вы также должны удалить его из списка. возможно, стоит сохранить этот объект ListNode в объекте для удаления O (1) из стека / очереди.
если доминирует один из методов удаления, может быть легко принять одно из указанных выше наказаний.
например, если вы не хотите удалять вещи по ключу (аля hashmap) и только pop (аля стек / очередь), а ключ легко вычисляется из объекта, (p1) не так уж много и подход абстракции работает.
Если метод удаления hashmap действительно будет доминировать, возможно, стоит отсортировать стек по hashkey, а затем выполнить двоичный поиск и затем удалить его из стека / очереди.
если вы хотите, чтобы хэш-карта сохраняла все (никогда не удаляло данные), но оставляла отдельную очередь / стек для обработки (только для удаления данных), тогда абстракция будет идеальной.
однако, если ни один из этих случаев не подходит, и вы не можете изменить объект (чтобы заставить его реализовать вашу схему кэширования), это будет означать, что вам придется кэшировать оба этих значения самостоятельно (ключ объекта и узел узла). который вводит третью структуру данных в ваш класс абстракции. в этот момент вы должны спросить себя, стоит ли это с этим подходом абстракции? в тех ситуациях, когда данные будут удалены в обоих направлениях одинаково (или непредсказуемо), тогда стоит сделать что-то заранее, ala jorg mittag. те реализации, которые я считаю, являются прямыми хеш-картами, но у каждого хеш-узла также есть предыдущая и следующая ссылка, такая как список, а сама хеш-карта имеет хвост и голову. (для стека / очереди, например, всплывающих окон / толчков)
в основном все сводится к тому, как вы собираетесь использовать эту структуру данных. Ни один алгоритм не может рассматриваться как лучшая стратегия, без разбивки того, как будут вызываться все методы, варианты использования.