# 顶端迭代器 给定一个迭代器类的接口,接口包含两个方法:`next()`和`hasNext()`。设计并实现一个支持`peek()`操作的顶端迭代器`--`其本质就是把原本应由`next()`方法返回的元素`peek()`出来。 ## 示例 ``` 假设迭代器被初始化为列表 [1,2,3]。 调用 next() 返回 1,得到列表中的第一个元素。 现在调用 peek() 返回 2,下一个元素。在此之后调用 next() 仍然返回 2。 最后一次调用 next() 返回 3,末尾元素。在此之后调用 hasNext() 应该返回 false。 ``` ## 题解 ```javascript /** * // This is the Iterator's API interface. * // You should not implement it, or speculate about its implementation. * function Iterator() { * @ return {number} * this.next = function() { // return the next number of the iterator * ... * }; * * @return {boolean} * this.hasNext = function() { // return true if it still has numbers * ... * }; * }; */ /** * @param {Iterator} iterator */ var PeekingIterator = function(iterator) { this.iterator = iterator; this.cache = null; }; /** * @return {number} */ PeekingIterator.prototype.peek = function() { if(this.cache !== null) return this.cache; var cache = this.iterator.next(); this.cache = cache; return cache; }; /** * @return {number} */ PeekingIterator.prototype.next = function() { if(this.cache !== null) { var cache = this.cache; this.cache = null; return cache; } return this.iterator.next(); }; /** * @return {boolean} */ PeekingIterator.prototype.hasNext = function() { if(this.cache !== null) return true; return this.iterator.hasNext(); }; /** * Your PeekingIterator object will be instantiated and called as such: * var obj = new PeekingIterator(arr) * var param_1 = obj.peek() * var param_2 = obj.next() * var param_3 = obj.hasNext() */ ``` ## 思路 本题的意思是现在已经有一个迭代器`iterator`,其实现了两个方法`next()`和`hasNext()`,需要通过这两个方法实现一个新的迭代器方法`peek()`,通过实现`PeekingIterator`构造函数以及`new`实例化构造函数,那么在`PeekingIterator`构造函数的原型链上实现`next()`、`hasNext()`和`peek()`方法即可,实例化对象时赋值传入的`iterator`对象的引用到`iterator`属相中,定义`cache`属性作为缓存并初始化赋值为`null`,首先实现`peek()`方法,在调用该方法时首先取出迭代器对象的`next`值,并将其写到`cache`属性中然后返回该值,然后实现`next()`方法,首先判断`cache`是否为`null`,存在缓存则将缓存置为`null`且返回缓存值,不存在缓存则直接调用迭代器的`next()`方法,同样对于`hasNext()`方法的实现,首先判断缓存是否存在,如果存在缓存则认为并未迭代完成,若不存在缓存则调用迭代器的`hasNext()`进行判断。 ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 题源 ``` https://leetcode-cn.com/problems/peeking-iterator/ ```