如何更改函数中的引用

时间:2012-09-23 12:57:45

标签: java

在下面的代码片段中,p是二叉搜索树中的一个节点,如果p的左子节点不为null,我想将p更改为指向其左子节点,但是java是按值传递的,当函数返回树的结构保持不变。

void remove(BSTNode p)
{
    if(p.ch[0]==null)
        p=p.ch[0];
}

实际上我想实现类似下面的C ++代码:

void remove(BSTNode* &p)
{
    if(p->ch[0]==NULL)
        p=p->ch[0];
}

由于其他原因,我不想使用以下方式返回p.ch [0]并在每次调用删除后设置p。

BSTNode remove(BSTNode p)
{
    if(p.ch[0]==null)
        return p.ch[0];
}

怎么做?

4 个答案:

答案 0 :(得分:2)

您可以使用简单的包装器:

class Wrapper<T> {
    public T value;
}

void remove(Wrapper<BSTNode> p)
{
    if(p.value.ch[0] == null)
        p.value = p.value.ch[0];
}

答案 1 :(得分:1)

传递引用并更改它只会对Java没有任何影响,您只会更改新的本地引用 尽管你有其他原因,我建议你选择最后一种方法。

另一种解决方法是传入p的父节点,并更改该对象中的引用。

答案 2 :(得分:1)

@outlaw,您可能知道,Java不支持指针。我对你的要求知之甚少,但我多次遇到过这种情况。通常我所做的是:而不是赋值p = p.ch[0])转移p.ch[0] to p的属性。

答案 3 :(得分:1)

您可以保存指向父节点的指针,然后使用该引用更改它

void remove(BSTNode p)
{
    if(p.ch[0]==null){
    p.parent.ch[0] = p.ch[0];
}