2012-11-02 42 views
1

我想實現刪除功能困惑鏈表刪除

public static boolean delete(Object d, ListElement head){ 
ListElement p=find(d,head); 
if(p.data==null){return false;} 
else { 
    System.out.println("Delete Successfully!"); 
    if(head.data==d){head=head.next;} 
    else{ 
    while(head.next.data!=d){ 
     head=head.next; 
    } 
    head.next=head.next.next;} 
    return true;} 

} 

這個功能基本上檢查元素d是在列表中, - 如果not->return false;

-else檢查是否元素是列表中的第一個元素,如果true,將頭部更改爲它的next,

-else遍歷到它前面的列表元素。

問題是,要刪除的元素是第一個元素,例如布爾型s=ListElement.delete(1,d);我不能使用「head=head.next;」將新值賦給head。 但是java通過引用傳遞,爲什麼我不能改變它?

//其實我發現我的問題是,我們是否可以改變傳遞給函數的功能 內引用,如:

void fun(dog a){ 
    a=new dog("Po"); 
} 
main() 
{dog b=new dog("Jo");fun(b);} 

//所以將b是否會改變?

回答

1

到第一列表元素的參考或者由列表對象本身或由「不可見」的根元素保持(在單鏈表的情況下)。

所以你要麼必須將整個列表傳遞給方法,要麼如果你有那個不可見的根,傳遞根作爲頭。

public static boolean delete(Object d, MyLinkedList<ListElement> list) { 

    ListElement head = list.getHead(); 
    if (head.data.equals(d)) { // <- ALWAYS use equals, never == to compare objects!! 
    list.setHead(head.next); 
    } else { 
    ListElement element = head.next; 

    // ... the rest is similiar to your algorithm 

    } 
} 
+0

這是一個解決方案。嗯,我試圖避免使用集合來實現我自己的類。基本上,我的問題是我們是否可以改變傳遞給函數內部函數的參考值。 –

+0

我們不能改變「通過參考」,這是根本。而且,我的解決方案不需要使用Collections類。我會改變類型名稱,使其更清晰:) –

+0

Thx!所以我需要在MyLinedList類中添加setHead()函數來重置頭部。只是想知道是否會有更加漂亮的方式將兩種情況(第一種元素)結合在一起。真的很感謝你的回覆 –

-1
void delete(visit_ptr_node_type this_is_the_node) 
{ 
    visit_ptr_node_type one_back; 
    if(anchor == NULL) 
    printf("\n The list is empty"); 
    else 
    { 
    if(this_is_the_node==anchor) 
     anchor=anchor->next_ptr; 
    else 
     { 
     one_back=anchor; 
     while(one_back->next_ptr != this_is_the_node) 
    one_back=one_back->next_ptr; 
     one_back->next_ptr = (this_is_the_node) ->next_ptr; 
     } 
    free(this_is_the_node); 
    } 
} 
+1

這是(1)不是java和(2)使用一些全局變量(錨點),所以答案不是真正幫助解決底層的「在Java中通過引用」的問題。 –

0

Java的引用傳遞的想法意味着,當你調用一個方法,並給予一定的對象作爲參數,你會得到一個新的參考指向同一個對象。

改變值,會改變對象,反過來也會影響其他的引用。但是如果你給參數賦予一個新的值,那隻會改變它,指向一些不同的對象。 (值得一提的是,有些語言允許改變參數,改變第一個參數。)