在Java单一链接列表实现中,为什么不打印链接列表的最后一个元素?

时间:2020-05-04 01:30:00

标签: java data-structures linked-list singly-linked-list

public class Linked_List <E>{
    public static class Node<E>{
        private E element;
        private Node<E> next;
        public Node(E e,Node<E> n) {
        element=e;
        next=n;
    }
    public E getElement() {
        return element;
    }
    public Node<E> getNext() {
        return next;
    }
    public void setNext(Node<E> n) {
        next=n;
    }
}

public Node<E> head=null;
public Node<E> tail=null;
public int size=0;

public Linked_List() {}

public int size() {
    return size;
}

public boolean isEmpty() {
    return size==0;
}
public void addFirst(E e) {
    head=new Node<>(e,head);
    if(size==0)
        head=tail;
    size++;
}

public void addLast(E e) {
    Node<E> newest =new Node<>(e,null);
    if(isEmpty())
        head=newest;
    else
        tail.setNext(newest);
    tail=newest;
    size++;
}
public void show() {

    Node<E> n=head;
    if(size==0) {
        System.out.println("No elements to print");
        System.exit(0);
    }
    while(n.next!=null) {
        System.out.println(n.element);
        n=n.next;
    }
    System.out.println(n.element);
}

public static void main(String[] args) {
    Linked_List<Integer> list = new Linked_List<Integer>();

    list.addFirst(10);
    list.addFirst(11);
    list.addFirst(12);

    list.show();

}
}

在show()方法中,当while到达列表的最后一个元素时,它退出,因此该元素不会被打印。因此,show方法中的最后一个打印语句。 我已经在列表中添加了三个元素,但是当我执行show()方法时,只有前两个元素12和11被打印出来。我想念的是什么?谢谢。

4 个答案:

答案 0 :(得分:3)

在这里怎么样。这应该说tail = head

    public void addFirst(E e) {
        head = new Node<>(e, head);
        if (size == 0) {
            head = tail;
        }
        size++;
    }

答案 1 :(得分:0)

addFisrt()更改为:

public void addFirst(E e) {
    head = new Node<>(e, head);
    size++;
}

您可以调试addFirst(),第一个元素永远不会添加到LinkedList。

答案 2 :(得分:-1)

问题出在while循环条件下:

while(n.next!=null) {
        System.out.println(n.element);
        n=n.next;
    }

当列表到达元素n-1时,它将打印该元素,然后n将成为最后一个元素n=n.next。但是现在n作为最后一个元素,他的n.next将为null,因此由于不再满足条件而将中断。

答案 3 :(得分:-2)

您回答了自己的问题:

在show()方法中,当while到达列表的最后一个元素时, 它退出,因此该元素不会被打印。

此代码:

while(n.next!=null) {
    System.out.println(n.element);
    n=n.next;
}

表示“虽然不是最后一个元素,但要打印”。也就是说,代码明确不想打印最后一个元素。

我在这里假设您没有在问题描述中包含最终的打印语句-您添加了最终的打印内容来解决while循环问题。

您需要:

while (n != null) {
    System.out.println(n.element);
    n = n.next;
}

上面写着“当它是一个实际元素时,打印它”。