---
round: 3
ticket_no: 28
source_no: 16
slug: peeking-iterator
topic: Iterator
difficulty: Medium
leetcode_id: 284
attempted: true
score:
verdict:
reviewed_at:
---

# Билет 28 — Peeking Iterator

## Условие (как предъявлено)

Реализуйте итератор, который поддерживает операцию `peek():` возвращает следующий элемент, не сдвигая итератор.

Базовый итератор предоставляет методы `next()` и `hasNext()`. Расширьте их классом `PeekingIterator`, добавив метод `peek()`.

```
PeekingIterator.new([1,2,3])
next()      → 1
peek()      → 2    # указатель не сдвинут
next()      → 2
next()      → 3
hasNext()   → false
```

Constraints: `1 <= количество элементов <= 1000`; количество вызовов методов не превышает `1000`.

## Ответ

> Значит, в этой обертке важно отличать методы, которые. В общем, метод, который сдвигает, то есть next, вот он должен так: стоп, стоп, стоп, стоп. Давай ещё разочек. Когда мы вызываем вот этот метод `next`, значит мы на самом деле у итератора должны всё-таки запросить следующий элемент, закэшировать его у себя. Ну и вернуть. Если нас ещё раз спросят этот метод, мы увидим, что он закэшированное значение, и мы его ещё раз вернём. Если нас попросят следующий элемент, мы проверяем, есть ли у нас закэшированное значение. Возвращаем его. Если оно есть, и кэш стираем. Если кэша не было, то просто вызываем следующее значение. Вот и всё. Вот. Ну и, соответственно, если следующий элемент, мы тоже там с учётом хэша. То есть проверяем, если уже закэшированное значение есть, то мы говорим: да, есть. Если его там нету, значит, мы получается спрашиваем у оригинального итератора.

## Разбор

**Что верно:**

**Что упущено и ошибки:**

**Эталонная идея:**

**Время:** O(...) — что доминирует

**Память:** O(...) дополнительная (+ O(...) на выход / стек рекурсии)

**Граничные случаи:** 1) ... 2) ... 3) ...

**Критерии:** идея ⚠️ · структура данных ⚠️ · сложность ⚠️ · граничные случаи ⚠️

**Канон сложности:** сверить с [`../complexity-cheat-sheet.md`](../complexity-cheat-sheet.md) (таблица по 32 задачам)

**Разбор задачи:** [`../../algo-solutions/01-must-have/06-iterator/16-peeking-iterator.md`](../../algo-solutions/01-must-have/06-iterator/16-peeking-iterator.md)