题目描述(中等难度)

284. Peeking Iterator - 图1

给迭代器增加一个 peek 功能,也就是查看下一个元素,但是不从迭代器中弹出。

解法一

我第一反应是直接把迭代器的元素放到 list 中不就实现了吗?

  1. class PeekingIterator implements Iterator<Integer> {
  2. List<Integer> list;
  3. int cur = 0;
  4. public PeekingIterator(Iterator<Integer> iterator) {
  5. // initialize any member here.
  6. list = new ArrayList<>();
  7. while (iterator.hasNext())
  8. list.add(iterator.next());
  9. }
  10. // Returns the next element in the iteration without advancing the iterator.
  11. public Integer peek() {
  12. return list.get(cur);
  13. }
  14. // hasNext() and next() should behave the same as in the Iterator interface.
  15. // Override them if needed.
  16. @Override
  17. public Integer next() {
  18. return list.get(cur++);
  19. }
  20. @Override
  21. public boolean hasNext() {
  22. return cur < list.size();
  23. }
  24. }

解法二

解法一还真的通过了,觉得自己没有 get 题目的点,然后去逛 Discuss 了,原来题目想让我们这样做,分享 这里 的代码。

我们知道构造函数传进来的迭代器已经有了 nexthaseNext 函数,我们需要增加 peek 函数。我们可以加一个缓冲变量,记录当前要返回的值。

peek 的话只需要将缓冲变量直接返回。

next 的话我们需要更新缓冲变量,然后将之前的缓冲变量返回即可。

  1. class PeekingIterator implements Iterator<Integer> {
  2. private Integer next = null;//缓冲变量
  3. private Iterator<Integer> iter;
  4. public PeekingIterator(Iterator<Integer> iterator) {
  5. // initialize any member here.
  6. iter = iterator;
  7. if (iter.hasNext()){
  8. next = iter.next();
  9. }
  10. }
  11. // Returns the next element in the iteration without advancing the iterator.
  12. public Integer peek() {
  13. return next;
  14. }
  15. // hasNext() and next() should behave the same as in the Iterator interface.
  16. // Override them if needed.
  17. @Override
  18. public Integer next() {
  19. Integer res = next;
  20. next = iter.hasNext() ? iter.next() : null;
  21. return res;
  22. }
  23. @Override
  24. public boolean hasNext() {
  25. return next != null;
  26. }
  27. }

其实是比较简单的一道题,用到的思想也比较简单,增加了一个缓冲变量来实现 peek 的功能。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情