我已经实现了单链表,我按照Java文档中的方法进行了操作。所以我在列表中添加了4个元素(4个字符串:A,B,C和D),当我浏览列表时,它只输出最后3个,从B开始。它会跳过第一个元素。它实际上是跳过它还是" head"只是没有引用下一个元素?
@Override
public void add(E element) {
Node<E> newNode = new Node<E>(element, null);
if(head == null){
head = newNode;
tail = newNode;
} else {
tail.next = newNode;
tail = newNode;
}
}
编辑:我如何打印元素:
MyList<String> list = new MyList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
for(String s : list){
System.out.println(s);
}
编辑2:
public class MyList<E> implements SingleList<E> {
private Node<E> head;
private Node<E> tail;
private int size;
public MyList() {
this.head = null;
this.tail = null;
this.size = 0;
}
private static class Node<E> {
E data;
Node<E> next;
public Node(E data, Node<E> next) {
this.data = data;
this.next = next;
}
}
private class iter implements Iterator<E> {
Node<E> previous;
Node<E> currentElement;
public iter(){
previous = null;
currentElement = head;
}
@Override
public boolean hasNext() {
return currentElement.next != null;
}
@Override
public E next() {
if(! hasNext()){
throw new NoSuchElementException("No more elements");
}
previous = currentElement;
currentElement = currentElement.next;
return currentElement.data;
}
@Override
public void remove(){
Node<E> remove = currentElement;
currentElement = currentElement.next;
previous.setNext(currentElement);
}
}
@Override
public Iterator<E> iterator() {
return new iter();
}
@Override
public void add(E element) {
Node<E> newNode = new Node<E>(element, null);
if(head == null){
head = newNode;
tail = newNode;
} else {
tail.next = newNode;
tail = newNode;
}
size++;
}
答案 0 :(得分:2)
您的迭代器错误会跳过第一个元素。
请注意,在创建迭代器时,将currentValue设置为head。但是在next()
中,您将当前值设置为下一个元素,然后返回下一个元素,而不是返回当前元素。这会导致跳过第一个值,因为对next()
的第一次调用将返回head.next
而不是头部。
答案 1 :(得分:0)
这应该可以正常工作。
您确定没有正确使用第一个元素的打印功能中的错误吗?
答案 2 :(得分:0)
就像puhlen告诉你的那样,你的next()方法存在问题。
next()
返回迭代中的下一个元素。
因此,如果要遍历列表,则应返回列表中的第一个节点。然后第二个节点,依此类推......
public E next() {
if(! hasNext()){
throw new NoSuchElementException("No more elements");
}
Node<E> actualNode = currentElement; //Save current node
currentElement = currentElement.next; // Move to the next node
return actualNode.data; //return the current node element
}
hasNext()
如果迭代有更多元素,则返回true。
public boolean hasNext() {
return currentElement.next != null;
}