Это может быть O (1), если список будет хранить флаг, который позволяет подкачку смысл «prev
» и «next
» указатели каждый узел имеет. Если реверсирование списка будет частой операцией, такое добавление может быть действительно полезным, и я не знаю ни одной причины, по которой его реализация будет запрещена действующим стандартом. Однако, имея такой флаг сделал бы обычный обходом из списка более дорогих (если только постоянным множителем), потому что вместо
current = current->next;
в operator++
из списка итератора, вы получите
if (reversed)
current = current->prev;
else
current = current->next;
, который вы не можете легко добавить. Учитывая, что списки обычно пересекаются гораздо чаще, чем они меняются, было бы очень неразумно для стандарта мандат этой техники. Поэтому для обратной работы допускается линейная сложность. Есть ли к сведению, однако, что т ∈ O (1) ⇒ т ∈ O ( п) так, как уже упоминалось ранее, реализации вашей «оптимизации» технически будет разрешено.
Если вы используете Java или аналогичный фон, вы можете задаться вопросом, почему итератору необходимо каждый раз проверять флаг. Можем ли мы вместо этого иметь два разных типа итератора, оба из которых основаны на общем базовом типе, и имеют std::list::begin
и std::list::rbegin
полиморфно возвращают соответствующий итератор? Хотя это возможно, это еще больше ухудшит ситуацию, потому что продвижение итератора теперь будет косвенным (трудно встроенным) вызовом функции.В Java вы платите эту цену в любом случае, но опять же, это одна из причин, по которой многие люди достигают C++, когда производительность критическая.
Как отметили Benjamin Lindley в комментариях, поскольку reverse
не допускается недействительной итераторы, единственный подход, разрешенный стандарт, кажется, чтобы хранить указатель обратно в список внутри итератора, который вызывает двойную косвенную память доступ.
Я не понимаю, почему люди пускают этот вопрос. Это вполне разумный вопрос. При обращении к двусвязному списку следует время O (1). – Curious
К сожалению, некоторые люди путают понятия «вопрос хороший» с «вопрос имеет хорошую идею». Мне нравятся такие вопросы, когда в основном «мое понимание кажется другим, чем общепринятая практика, пожалуйста, помогите решить этот конфликт», потому что расширение, как вы думаете, поможет вам решить гораздо больше проблем в будущем! Казалось бы, другие придерживаются подхода «это отходы обработки в 99,9999% случаев, даже не думайте об этом». Если это какое-то утешение, я был занижен на многое, а тем более! – corsiKa
Да, этот вопрос получил чрезмерное количество downvotes за его качество. Вероятно, это то же самое, что и тот, кто поддержал ответ Блинди.Справедливости ради следует сказать, что «обращение вспять двойного списка должно включать только переключение указателей на голову и хвост», как правило, неверно для стандартного связанного списка, который каждый учит в старшей школе или для многих реализаций, которые используют люди. Много раз в непосредственном реагировании SO-людей на вопрос или ответ вытесняет решение upvote/downvote. Если бы вы были более ясны в этом предложении или не указали его, я думаю, вы бы получили меньше downvotes. –