2014-01-10 140 views
0

彈出項目我實現了一個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* 
+3

由於pop()方法返回布爾值,它如何讓你成爲最後一個元素的副本? – wxyz

+0

不清楚你在問什麼。也不清楚爲什麼你要看2個節點;似乎這將拋出一個NPE時,大小== 2. –

+0

@BrianRoach,我認爲當大小爲2,時不會執行,並將鏈接到第二個元素將被刪除 - >看起來不錯。 – wxyz

回答

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; 
    } 
    } 
}