2014-01-30 22 views
1

所以我們有了這個任務,我們應該寫一個單獨的鏈表。我已經完成了這部分,但老師希望我們添加一個名稱爲isHealthy()的方法來測試一些條件。我在執行測試其中一個條件的代碼時遇到了問題。寫一個單獨鏈接的列表並在其上運行測試代碼

下面是類構造函數和方法isHealthy:

/** 
* A singly linked list. 
* 
*/ 
public class LinkedList<T> { 
private ListElement<T> first; // First element in list. 
private ListElement<T> last; // Last element in list. 
private int size;    // Number of elements in list. 

/** 
* A list element. 
*/ 
private static class ListElement<T> { 
    public T data; 
    public ListElement<T> next; 

    public ListElement(T data) { 
     this.data = data; 
     this.next = null; 
    } 
} 

/** 
* Creates an empty list. 
*/ 
public LinkedList() { 
    // TODO 
    first = null; 
    last = null; 
    size = 0; 
} 

/** 
* This TEST METHOD returns true if the following invariants hold: 
* <ul> 
* <li> size equals the number of list elements, </li> 
*  *****Rest of the conditions omitted***** 
* </ul> 
*/ 
public boolean isHealthy() { 
    // TODO 
    boolean var = false; 
    int counter; 
    if(first == null && last == null) { 
     counter = 0; 
    } 
    else { 
     for(T elements :) { 
      counter++; 
     } 
    } 
    if(counter == size) { 
     var = true; 
    } 
    return var; 
} 
******Rest of code omitted****** 

所以基本上我需要證明大小字段等於列表中元素的個數。正如你所看到的,我試圖通過一個名爲的計數器這個本地變量來做到這一點,如果列表中沒有元素,它將被設置爲0。

如果有元素,那麼我的計劃是迭代整個列表,並在每次找到新元素時向計數器變量添加一個值。然後,我會檢查是否計數器保持與尺寸相同的值,如果它確實那麼它是正確的。

我遇到的問題是我該如何通過列表迭代當該類是List?這就是我應該寫在這裏:

for(T elements : **here**) 

是否有可能遍歷列表中的類列表?

+0

有創建鏈表的類也有'isHealthy()'方法。然後你可以在完全創建的列表中調用'isHealthy()'。你可以通過在你的列表中使用'next'變量遍歷你的類,但是如果你從列表中的一箇中間元素調用'isHealthy()',計數器將不匹配到總數 – mdewitt

回答

0

這裏你有這裏把你的清單ot收集(Iterable)元素。 我知道你有更多的元素,不僅僅是「第一」和「最後」,所以放在那裏你的ListElement列表。 順便說一句,不知道你是什麼JVM,但調用類LinkedList它不編譯。這是內心階層嗎?

1
public boolean isHealthy(){ 

    int counter = 0; 
    ListElement<T> node = first; 
    while(node.next != null){ 
     counter++; 
     node = node.next; 
    } 

    // this checks if the if statement fails 
    // or not and returns the result(true/false) 
    return if (counter == size); 
} 

您只需檢查下一個元素是否存在。

+1

'返回計數器==大小;'更簡潔,IMO就像可讀。 –

+0

@BrianS完全同意,我其實完全錯過了它。 OP的可讀性可能較差,似乎對編程有點新意。但好的建議添加它,並注意它做了什麼。 – progrenhard

+0

Thx的答覆..我得到這個問題是,當你沒有任何元素,然後: first == null。因此node == null。 在執行isHealthy時沒有任何元素的while循環中,node.next語句帶來了java.lang中的 。NullPointerException:null 錯誤 – user3043462

0

爲了使用每個循環,您需要實現接口Iterable。由於類定義不允許我認爲最好的解決方案,如果使用迭代下一個變量,像:

it = first; 
while(it != last){ 
    it = it.next; 
    counter++; 
} 

你也可以使用一個更優雅的遞歸方法來做到這一點。

+0

非常感謝!只是一個問題是不是更好:「while(it!= null)」? 因爲「it!= last」使它在最後一個元素之前停止計數一次?如果我有「it!= null」,那麼當我們到達最後一個元素時,it.next指向null並且while循環停止。 – user3043462

相關問題