---
round: 1
ticket_no: 4
source_no: 16
slug: peeking-iterator
topic: Iterator
difficulty: Medium
leetcode_id: 284
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

# Билет 04 — Peeking Iterator

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

Нужно реализовать обёртку над итератором, у которой кроме `next()` и `hasNext()` есть `peek()` — он возвращает следующий элемент, не сдвигая указатель.

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

Constraints: `1 <= n <= 1000`, максимум 1000 вызовов.

## Ответ

> Так, здесь идея такая, что при вызове метода next мы должны вызвать на итераторе next, то есть на самом деле перевести итератор на следующее значение и закэшировать это значение, запомнить его. Если у нас его ещё раз спросят, а мы увидим, что там у нас закэшированное есть, мы его возвращаем. То есть ещё раз next не переводим. Значит, если нас спрашивают next, то мы проверяем, есть ли у нас кэшированное значение. Если оно есть, то мы его возвращаем и стираем. То есть мы теперь снова в чистом состоянии. Вот. Ну, и, соответственно, hash next тоже у нас в чём там идея. Hash next. Ну, соответственно, если у нас закэшированное значение есть, то получается, мы его проверяем. Значит, hash next есть. Если там нет значения, значит мы в чистом состоянии. То есть это получается два состояния — чистое и грязное состояние. И вот эти методы начинают использовать кэширующий этот элемент, закэшированный один элемент, который как раз будет нам помогать отвечать на вопрос без дергания итератора.

## Разбор

**Что верно:** кэш одного элемента и два состояния (чистое/грязное), hasNext смотрит в кэш, next отдаёт кэшированное значение и очищает кэш — ключевая идея схвачена.

**Что упущено и ошибки:** перепутано, кто наполняет кэш: по ответу кэширует next(), и тогда peek() не делает ничего; правильно наоборот — peek() при пустом кэше тянет элемент у родителя и сохраняет, next() возвращает кэш либо делегирует родителю. Не названа сложность O(1) на операцию. Нет поведения peek() в конце итератора.

**Эталонная идея:** @next_val / @has_next; peek — если кэша нет, взять у родителя, сохранить и вернуть; next — вернуть кэш с очисткой либо делегировать; hasNext — кэш || родитель.

**Сложность:** время O(1) на операцию, память O(1)

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


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