将堆栈元素移回单个链接列表

时间:2014-03-05 08:54:52

标签: java linked-list stack

我正在尝试将列表元素移动到堆栈并再次返回列表,反转它们的顺序。

我在最后一点将堆栈传回列表时遇到了麻烦。 我一直在以不同的方式使用stack.pop();,但似乎没有任何效果。

到目前为止,我能够打印出stack.pop的输出,但我真的希望能够将堆栈内容传回列表。

    public class ReverseArray {

    public static void main(String[] args) throws EmptyStackException {
        // TODO Auto-generated method stub

        MyLinkedList<GameEntry>myList = new MyLinkedList<>();

        //populate the list
        myList.addFirst(new Node<GameEntry>(new GameEntry("Marche", 313), null));
        myList.addFirst(new Node<GameEntry>(new GameEntry("Apricot", 754), null));
        myList.addFirst(new Node<GameEntry>(new GameEntry("Dragon", 284), null));
        myList.addFirst(new Node<GameEntry>(new GameEntry("Erasure", 653), null));

        //print the list
        System.out.println(myList);
        System.out.println();
        System.out.println("New Reversed List:");
        //reverse the list elements 
        reverse(myList);



    }

    public static <V> void reverse ( MyLinkedList<V> list) throws EmptyStackException{
        //code to reverse goes here
        NodeStack<GameEntry> stack = new NodeStack<GameEntry>();
        Node<GameEntry> scores = list.getHead();

        for ( int i = 0; i < list.getSize(); i++){
            stack.push(scores.getElement());
            scores = scores.getNext();

        }

        while(!stack.isEmpty()){
            System.out.print(stack.pop() + " ");

        }

    }// end reverse
}//end main

2 个答案:

答案 0 :(得分:0)

假设您希望列表仅包含反转元素,则必须首先清除列表。根据您的实施情况,您使用clear()方法,或者必须多次致电remove(),直至列表为止。

之后您可以添加如下代码:

while(!stack.isEmpty()){
    GameEntry entry = stack.pop();
    list.addFirst(entry);
}

这样你应该在列表中有相反的元素顺序。

替代方案是使用MyLinkedList实现List接口并使用Collections.reverse()


完全错过了订单与输入列表中的订单相同。因此,您有两种选择:

  1. 使用队列而不是堆栈。
  2. 使用填充了第一个堆栈内容的第二个堆栈。这可能看起来像:

    NodeStack<GameEntry> secondStack = new NodeStack<GameEntry>(); 
    while(!stack.isEmpty()){
        secondStack.push(stack.pop());
    }
    
    while(!secondStack.isEmpty()){
        GameEntry entry = secondStack.pop();
        list.addFirst(entry);
    }
    

答案 1 :(得分:0)

您应该从堆栈中保留订单,因此请在新LinkedList的末尾添加它们:

while(!stack.isEmpty()){
    GameEntry entry = stack.pop();
    list.addLast(entry);
}