【问题标题】:addFirst() method in Deque implementationDeque 实现中的 addFirst() 方法
【发布时间】:2013-09-19 21:01:03
【问题描述】:

我正在尝试使用链表在 java 中实现 Deque。作为开始,我想实现方法addFirst()。这是我遇到的问题——当我添加几个字符串时,例如“一”、“二”和“三”,它插入正确,但是在迭代双端队列时,它只给出最后添加的对象,不是所有的对象。我有什么遗漏吗?

public class Deque<Item> implements Iterable<Item> {
  private Node first;
  private Node last;
  private int N;

  public Iterator<Item> iterator() { return new DequeIterator(); }

  private class Node {
    private Item item;
    private Node next;
  }

  public Deque() {
    first = null;
    last = null;
    N = 0;
  }

  public boolean isEmpty() { return first == null || last == null; }
  public int size() { return N; }

  public void addFirst(Item item) {
  if (null == item) { throw new NullPointerException("Can not add a null value"); }
  Node oldFirst = first;
  first = new Node();
  first.item = item;
  first.next = null;

  if (isEmpty()) {
    last = first;
  } else {
    oldFirst.next = first;
  }

  N++; 
 }

 private class DequeIterator implements Iterator<Item> {
   private Node current = first;

   public boolean hasNext() { return current != null; }
   public void remove() { throw new UnsupportedOperationException(); }

   public Item next() {
    if (!hasNext()) { throw new NoSuchElementException(); }
    Item item = current.item;
    current = current.next;
    return item;
   }

 }

 public static void main(String args[]) {
   Deque<String> deque = new Deque<String>();
   deque.addFirst("one");
   deque.addFirst("two");
   deque.addFirst("three");
   deque.addFirst("four");

   for (String s : deque) {
     System.out.println(s); // prints only "four"
   }
 }
}

【问题讨论】:

    标签: java iterator linked-list deque


    【解决方案1】:

    addFirst() 中的oldFirst.next = first 更改为first.next = oldFirst,它应该可以工作。

    现在first.nextaddFirst() 调用之后没有指向任何东西,因为您将其设置为null。这会导致hasNext() 方法返回false,从而导致无效的迭代。

    【讨论】:

      【解决方案2】:
      import java.util.Iterator;
      import java.util.NoSuchElementException;
      
      public class Deque<Item> implements Iterable<Item> {
      
          private Deque.Node first;
          private Deque.Node last;
          private int N;
      
          public Iterator<Item> iterator() {
              return new Deque.DequeIterator();
          }
      
          private class Node {
      
              private Item item;
              private Deque.Node next;
          }
      
          public Deque() {
              first = null;
              last = null;
              N = 0;
          }
      
          public boolean isEmpty() {
              return first == null || last == null;
          }
      
          public int size() {
              return N;
          }
      
          public void addFirst(Item item) {
              if (null == item) {
                  throw new NullPointerException("Can not add a null value");
              }
              if (first == null && last == null) {
                  first = new Node();
                  first.item = item;
                  first.next = null;
                  last = first;
              } else {
                  Node node = new Node();
                  node.item = item;
                  node.next = first;
                  first = node;
              }
      
              N++;
          }
      
          private class DequeIterator implements Iterator<Item> {
      
              private Deque.Node current = first;
      
              public boolean hasNext() {
                  return current != null;
              }
      
              public void remove() {
                  throw new UnsupportedOperationException();
              }
      
              public Item next() {
                  if (!hasNext()) {
                      throw new NoSuchElementException();
                  }
                  Item item = (Item) current.item;
                  current = current.next;
                  return item;
              }
          }
      
          public static void main(String args[]) {
              Deque<String> deque = new Deque<String>();
              deque.addFirst("one");
              deque.addFirst("two");
              deque.addFirst("three");
              deque.addFirst("four");
      
              for (String s : deque) {
                  System.out.println(s); // prints only "four"
              }
          }
      }
      

      输出:

      four
      three
      two
      one
      

      【讨论】:

        猜你喜欢
        • 2016-06-10
        • 1970-01-01
        • 2015-04-03
        • 2012-09-20
        • 1970-01-01
        • 2014-04-13
        • 2019-10-12
        • 1970-01-01
        • 2019-05-21
        相关资源
        最近更新 更多