单链表:添加元素后输出错误

时间:2018-01-17 20:04:38

标签: java

我已经实现了单链表,我按照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++;
}

3 个答案:

答案 0 :(得分:2)

您的迭代器错误会跳过第一个元素。

请注意,在创建迭代器时,将currentValue设置为head。但是在next()中,您将当前值设置为下一个元素,然后返回下一个元素,而不是返回当前元素。这会导致跳过第一个值,因为对next()的第一次调用将返回head.next而不是头部。

答案 1 :(得分:0)

这应该可以正常工作。

您确定没有正确使用第一个元素的打印功能中的错误吗?

答案 2 :(得分:0)

就像puhlen告诉你的那样,你的next()方法存在问题。

Documentation指出:

  

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