Java Deque实现中的addFirst()方法
我正在尝试使用链表在java中实现一个Deque。首先,我想实现方法Java Deque实现中的addFirst()方法,java,iterator,linked-list,deque,Java,Iterator,Linked List,Deque,我正在尝试使用链表在java中实现一个Deque。首先,我想实现方法addFirst()。这里是我遇到的问题——当我添加几个字符串时,例如“一”、“二”和“三”,它是正确插入的,但是当迭代deque时,它只是给出最后添加的对象,而不是所有的对象。我有什么遗漏吗 public class Deque<Item> implements Iterable<Item> { private Node first; private Node last; private i
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"
}
}
}
public类Deque实现了Iterable{
私有节点优先;
最后是私有节点;
私人int N;
公共迭代器迭代器(){返回新的DequeIterator();}
私有类节点{
私人物品;
私有节点下一步;
}
公共部门(){
第一个=空;
last=null;
N=0;
}
公共布尔值isEmpty(){return first==null | | last==null;}
public int size(){return N;}
公共无效添加第一个(项目){
if(null==item){抛出新的NullPointerException(“无法添加空值”);}
节点oldFirst=第一个;
第一个=新节点();
first.item=项目;
first.next=null;
if(isEmpty()){
最后=第一;
}否则{
oldFirst.next=first;
}
N++;
}
私有类DequeIterator实现迭代器{
私有节点电流=第一;
公共布尔值hasNext(){返回当前值!=null;}
public void remove(){抛出新的UnsupportedOperationException();}
公共项目下一步(){
如果(!hasNext()){抛出新的NoSuchElementException();}
项目=当前项目;
当前=当前。下一步;
退货项目;
}
}
公共静态void main(字符串参数[]){
Deque Deque=新Deque();
deque.addFirst(“一”);
deque.addFirst(“两个”);
deque.addFirst(“三”);
deque.addFirst(“四”);
for(字符串s:deque){
System.out.println(s);//只打印“四”
}
}
}
在addFirst()
中将oldFirst.next=first
更改为first.next=oldFirst
,它应该可以工作
现在first.next
afteraddFirst()
调用没有指向任何东西,因为您正在将其设置为null
。这会导致hasNext()
方法返回false,导致迭代无效
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