2013-09-15 8 views
3

Я пытаюсь реализовать Deque в java, используя связанный список. В начале я хочу реализовать метод addFirst(). Вот проблема, которую я получаю - когда я добавляю несколько строк, например, «один», «два» и «три», он вставляет правильно, но при повторении дека он только дает последний добавленный объект, не все объекты. Есть что-то, чего я не вижу?addFirst() метод в реализации Deque

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" 
    } 
} 
} 

ответ

2

Изменение oldFirst.next = first к first.next = oldFirst в addFirst() и он должен работать.

Прямо сейчас first.next после addFirst() звонок не указывает ни на что, поскольку вы устанавливаете его на null. Это приводит к тому, что метод hasNext() возвращает false, что приводит к недействительной итерации.

+0

да, вы правы, это сработало. – Kinjal

1
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 
Смежные вопросы