class StackNode{
int data;
StackNode next;
public StackNode(int data, StackNode next){
this.data = data;
this.next = next;
}
}
public class StackWithLinkedList {
StackNode root = null;
public void push(int data){
if(root == null)
root = new StackNode(data, null);
else {
StackNode temp = root;
while(temp.next != null)
temp = temp.next;
temp.next = new StackNode(data, null);
}
}
public int pop() throws Exception{
if(root == null)
throw new Exception("No Elements in Stack");
else {
StackNode temp = root;
while(temp.next != null)
temp = temp.next;
int data = temp.data;
temp = null;
return data;
}
}
public void print(){
StackNode temp = root;
while(temp!= null){
System.out.print(temp.data +" ");
temp = temp.next;
}
System.out.print("\n");
}
public static void main(String[] args) {
StackWithLinkedList stack = new StackWithLinkedList();
for(int i = 1; i<=15; i++){
Random randomGen = new Random();
stack.push(randomGen.nextInt(i));
}
stack.print();
System.out.print("\n");
try {
System.out.println("Deleted: "+stack.pop());
System.out.println("Deleted: "+stack.pop());
} catch (Exception e) {
e.printStackTrace();
}
stack.print();
}
}
我正在尝试使用Linkedlist实现Stack。在pop函数中,我遍历到最后一个节点并使其为null。当我打印列表时。它保持不变。是否将root分配给temp并遍历它会导致任何问题?
答案 0 :(得分:3)
您可以通过简化实施来避免这一切。它只是一堆,所以它是LIFO。您需要做的就是将最后一个元素x
设为var
。当push
- 返回root
中的pop
并将data
设置为下一行时。
您执行该操作的方式会增加root
和root
操作的O(1)
到O(N)
的典型复杂性。
类似的东西:
push
答案 1 :(得分:2)
正如@ChiefTwoPencils在其他答案中所提到的,这必须是实现这一点的首选方式。但是,要纠正弹出操作的逻辑,您应该跟踪倒数第二个项目,一旦得到它,您可以返回下一个节点的数据值,并将下一个链接设置为null。
这是从你的pop方法代码改变逻辑
public int pop() throws Exception{
if(root == null)
throw new Exception("No Elements in Stack");
else {
int data = -1;
if(root.next==null) {
data = root.data;
root = null;
return data;
}
StackNode temp = root;
while(temp.next.next != null)
temp = temp.next;
data = temp.next.data;
temp.next = null;
return data;
}
}
希望它有所帮助。
答案 2 :(得分:0)
public int pop() throws Exception{
if(root == null)
throw new Exception("No Elements in Stack");
else {
StackNode temp = root;
StackNode prev;
while(temp.next != null){
prev = temp;
temp = temp.next;
}
int data = temp.data;
prev.next = null;
return data;
}
}