Java中链表的堆栈操作

Java中链表的堆栈操作,java,linked-list,stack,Java,Linked List,Stack,我必须编写一个类,该类应该使用链表实现堆栈。但是,它应该从列表的尾部而不是头部执行推送和弹出操作。此外,它不应该维护对列表尾部节点的引用 在不保留最后一个节点的引用的情况下,我究竟如何实现这一点呢?您可以这样做,但这将是非常低效的,因为您每次想做某事时都必须浏览整个列表。当所有操作都在尾部执行时,您确实没有任何理由希望保留对头部的引用 但无论如何,我会这样做: class Entry<E> { E object; Entry<E> next; pu

我必须编写一个类,该类应该使用链表实现堆栈。但是,它应该从列表的尾部而不是头部执行推送和弹出操作。此外,它不应该维护对列表尾部节点的引用

在不保留最后一个节点的引用的情况下,我究竟如何实现这一点呢?

您可以这样做,但这将是非常低效的,因为您每次想做某事时都必须浏览整个列表。当所有操作都在尾部执行时,您确实没有任何理由希望保留对头部的引用

但无论如何,我会这样做:

class Entry<E> {
    E object;
    Entry<E> next;
    public Entry(E obj) {
        object = obj;
    }
}

class StackList<E> {
    Entry<E> head;
    public void push(E element) {
        if (head == null) {
            // first
            head = new Entry<E>(element);
            return;
        }
        Entry<E> node = head;
        while (node != null && node.next != null) {
            node = node.next;
        }
        // node is now the tail
        Entry<E> newEntry = new Entry<E>(element);
        node.next = newEntry;
    }
    public E pop() {
        if (head == null) {
            // empty
            return null;
        }
        Entry<E> node = head, previousNode = null;
        while (node.next != null) {
            previousNode = node;
            node = node.next;
        }
        // node is now the tail
        // previousNode is the next-to-last
        if (previousNode != null) {
            previousNode.next = null;
        } else {
            // there was only one thing
            head = null;
        }
        return node.object;
    }
}
类条目{
E对象;
进入下一步;
公众进入(E obj){
对象=obj;
}
}
类堆栈列表{
入口头;
公共无效推送(E元素){
if(head==null){
//首先
head=新条目(要素);
返回;
}
入口节点=头部;
while(node!=null&&node.next!=null){
node=node.next;
}
//节点现在是尾部
条目newEntry=新条目(元素);
node.next=newEntry;
}
公共E-pop(){
if(head==null){
//空的
返回null;
}
Entry node=head,previousNode=null;
while(node.next!=null){
previousNode=节点;
node=node.next;
}
//节点现在是尾部
//previousNode是倒数第二个节点
if(previousNode!=null){
previousNode.next=null;
}否则{
//只有一件事
head=null;
}
返回node.object;
}
}

您始终可以遍历列表直至其尾部。虽然不保留对最后一个节点的引用效率最低,这称为队列。是的,每次都要浏览一下这个列表。我想你对头和尾是什么感到困惑。我知道这是低效的,但这就是任务。。。