2013-11-04 96 views
-1

我將數據存儲在一個簡單的鏈表結構中, 這兩個循環在java中有什麼區別?我認爲第一個會使用較少的代碼做第二個,但它不起作用。java指針,這兩個循環有什麼區別?

//1 
temp = list.firstElement; 
while (temp != null) { 
    temp = temp.nextElement; 
} 
temp = *data*; 

//2 
if (list.firstElement == null) { 
    list.firstElement = *data*; 
} 
else { 
    temp = list.firstElement; 
    while (temp.nextElement != null) { 
    temp = temp.nextElement; 
    } 
    temp.nextElement = *data*; 
} 

爲什麼第二個添加一些東西到列表中,但第一個不? (第一個元素仍然爲空)

回答

2

在第一個片段中,所有temp = data;所做的是更改temp變量所指的內容 - 它不會修改列表中的任何對象。

+--+ +--+ +--+ +--+    temp->+--+   
| |->| |->| |->| |->null    | | 
+--+ +--+ +--+ +--+    data->+--+ 

在第二個片段,當temp東西在你的列表中,temp.nextElement = data;將分配data的東西,實際上是在列表中找到,從而改變列表。

   temp---+ 
        V 
+--+ +--+ +--+ +--+    
| |->| |->| |->| |-------->+--+ 
+--+ +--+ +--+ +--+   | | 
         data->+--+ 
1

當temp == null時,您完全退出第一個循環,即您已經完全退出列表。

當temp.nextElement == null時,您將退出第二個循環,這尤其表示temp!= null。這又意味着temp指向列表的最後一個元素,並且您可以成功設置nextElement字段。

1

通過第一個循環,直到當前元素爲null,然後將某個值賦給該值,但沒有人指向新值,因此它不可見。

與第二個循環,你經歷,直到你nextElement爲空,那麼你指定,所以它會有人指向它。