0

たとえば、以下に定義する再帰呼び出しを行います。このメソッドは、最後から k 番目の要素を見つけます。見つかった場合は、再帰呼び出しに渡すオブジェクトに現在のノードを割り当てます。何らかの理由で、ノード kth が null です。このように物事を行うことはできませんか?なぜ?

public void findKthFromLast(Node head, int k){
    Node kth;     
    recrusiveHelper(head, k, kth);
    System.out.println(kth.data); //this is null
}

public int recursiveHelper(Node n, int k, Node kthFromLast){
    (if n == null){
        return 0;
    }
    val = 1 + recursiveHelper(n.next, k, kthFromlast);
    if(k == val){
        kthFromLast = n;
    }
    return val;
}
4

3 に答える 3

3

オブジェクト参照がメソッドに対してローカルである場合、それへの変更は呼び出し元や他の人には見えません。

例えば:

void caller()
{
    obj = new String("asdf");
    doStuff(obj)
    System.out.println(obj) // still prints "asdf"
}

void doStuff(String obj)
{  
   // obj is a local reference, changing it wont affect caller's ref 
   obj = new String("ghj");
}
于 2012-09-30T14:37:47.563 に答える
2

まず、そのコードは初期化されておらず、メソッド呼び出しkthの引数として使用できないため、コンパイルしないでください。recursiveHelper

第 2 に、呼び出されたメソッドの参照に対する変更は、Java の呼び出し元に伝播されません。つまり、

private void caller()
{
    StringBuilder s = new StringBuilder();
    s.append("test");
    calledMethod1(s);
    System.out.println(s.toString());
    calledMethod2(s);
    System.out.println(s.toString());
}

private void calledMethod1(StringBuilder buffer)
{
    buffer = new StringBuilder();
    buffer.append("calledMethod1");
    return;
}

private void calledMethod2(StringBuilder buffer)
{
    buffer.append(", calledMethod2");
    return;
}

出力:

test
test, calledMethod2

その理由は、メソッドが呼び出されたときに参照が指すものを変更するcalledMethod1だけで、参照が指しbufferていたものを変更していないためです。bufferではcalledMethod2、 によって参照されるオブジェクトに変更を加えているbufferため、変更は呼び出し元に表示されます。

あなたが出身者CまたはC++バックグラウンドである場合、これは、呼び出し元に渡されたものに影響を与えない、呼び出されたメソッドのポインター引数に割り当てることと同じです。

于 2012-09-30T14:39:34.380 に答える
0
public void findKthFromLast(Node head, int k){
    Node kth;     
    recrusiveHelper(head, k, kth);
    System.out.println(kth.data); //this is null
}

メソッドに null を渡すと、そのメソッド内で何をしても、これ以外では null のままになります。メソッドの外部から見える方法で reference の値を変更することはできません。

于 2012-09-30T14:38:57.850 に答える