我正在尝试将列表元素移动到堆栈并再次移回列表,从而颠倒它们的顺序。
我在将堆栈转移回列表中的最后一点时遇到问题。我一直在以不同的方式使用该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
您应该保持堆栈中的顺序,因此将它们添加到新LinkedList
的末尾:
while(!stack.isEmpty()){
GameEntry entry = stack.pop();
list.addLast(entry);
}
假设您希望列表仅包含反向元素,则必须首先清除列表。根据您的实现,您有一个clear()
方法,或者必须多次调用remove()
,直到列表为空。
之后,您可以添加如下代码:
while(!stack.isEmpty()){
GameEntry entry = stack.pop();
list.addFirst(entry);
}
这样,您应该具有列表中元素的相反顺序。
一个替代者将使用您的 MyLinkedList 实现 List
接口并使用 Collections.reverse()
。
完全错过了订单与输入列表中的顺序相同。因此,您有两种选择:
- 使用队列而不是堆栈。
使用第二个堆栈,它填充了第一个堆栈的内容。这可能看起来像:
NodeStack<GameEntry> secondStack = new NodeStack<GameEntry>(); while(!stack.isEmpty()){ secondStack.push(stack.pop()); } while(!secondStack.isEmpty()){ GameEntry entry = secondStack.pop(); list.addFirst(entry); }