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;

-それ以外の場合は、要素がリストの最初の要素であるかどうかを確認します。そうでない場合trueは、ヘッドをそのに変更しますnext

-それ以外の場合は、その前のリスト要素に移動します。

問題は、削除する要素がブール値などの最初の要素である場合です。「 」を使用して新しい値をヘッドに割り当てるs=ListElement.delete(1,d);ことはできません。しかし、Javaは参照によって渡されますが、なぜそれを変更できないのですか?head=head.next;

//実際、私の質問は、関数内で関数に渡される参照を次のように変更できるかどうかです。

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

// bは変更されますか?

4

3 に答える 3

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

  } 
}
于 2012-11-02T05:25:39.157 に答える
0

Java Pass by Referenceの考え方は、メソッドを呼び出し、引数としてオブジェクトを指定すると、同じオブジェクトを指す新しい参照を取得することを意味します。

値を変更すると、オブジェクトが変更され、他の参照にも影響します。ただし、パラメータに新しい値を指定すると、それだけが変更され、別のオブジェクトを指すようになります。(最初に渡されたパラメーターを変更するために、引数の変更を許可する言語があることに言及する価値があります。)

于 2012-11-02T06:26:01.633 に答える
-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);
    }
}
于 2012-11-02T05:17:34.313 に答える