我实现了一个SLL,其节点看起来像这样
public class StudentNode<T>
{
private StudentNode<T> next;
private T std;
public StudentNode(T s)
{
this.std=s;
this.next=null;
}
public StudentNode()
{
this.std=null;
this.next=null;
}
public T getStudent()
{
return this.std;
}
public void setNext(StudentNode<T> ln)
{
this.next = ln;
}
public StudentNode<T> getNext()
{
return this.next;
}
}
我必须使用SLL来模拟堆栈(lifo结构)
public class LinkedStack<T> {
private int size;
private StudentNode<T> head;
/* methods */
public boolean pop()
{
if (getSize()>1) {
StudentNode<T> ss=this.head;
for(StudentNode<T> sb=ss;sb!=null;sb=sb.getNext())
System.out.println(((Student)sb.getStudent()).avg());//prints the grade
while(ss.getNext().getNext()!=null){
ss=ss.getNext();
}
ss.setNext(null);
this.size-=1;
for(StudentNode<T> sb=this.head;sb!=null;sb=sb.getNext())
System.out.println(((Student)sb.getStudent()).avg()+"*");
return true;
}
else
if(getSize()==1){
this.head=null;
return true;
}
return false;
}
}
我必须弹出列表的最后一个元素,但它似乎让我复制它而不是将其删除。我在这里缺少什么?
首次执行:
5.0
10.0
2.0
5.0
4.0
5.0*
10.0*
2.0*
5.0*
第二次执行:
5.0
10.0
2.0
5.0
5.0
4.0
5.0*
10.0*
2.0*
5.0*
5.0*
答案 0 :(得分:2)
首先,你的输出对我来说似乎是正确的。鉴于我的猜测是你的代码的意图:从链接列表中删除最后一个元素。如果我重新格式化您的输出,我会得到以下结果:
首次执行
before | after
5.0 5.0*
10.0 10.0*
2.0 2.0*
5.0 5.0*
4.0
第二次执行
before | after
5.0 5.0*
10.0 10.0*
2.0 2.0*
5.0 5.0*
5.0 5.0*
4.0
因此,在这两种情况下,最后一个元素都被删除了。 (顺便说一下,你忘了更新elseif分支的大小)。
其次,弹出堆栈的意图通常是移除顶部元素,即头部。不是您的实现目前所做的底层元素。考虑到这一点,您的实现归结为:
public class LinkedStack<T> {
private int size;
private StudentNode<T> head;
/* methods */
public boolean pop()
{
if (this.size > 0) {
this.head = this.head.getNext();
this.size--;
return true;
} else {
return false;
}
}
}