试图从函数返回链表但无法弄清楚它为什么不起作用,

时间:2017-04-17 21:30:19

标签: java arrays linked-list

在下面的代码中,resultTree是从其他函数传递的,我正在尝试更新结果树但是在最后我没有赋值,而是我首先得到了值(如果我分配了它),否则我将得到空值。以下是代码,

`

heaviest = new LinkedList<Vertex>();
        mw = y.heaviestTree(graph, heaviest);
        System.out.println("heaviestTree: " + mw + " : " + heaviest);

 float heaviestTree(DiGraph G, LinkedList<Vertex> resultTree) {
        Set<Vertex> roots = rootVertices(G);


        LinkedList<Vertex>[] myList = new LinkedList[roots.size()];
        Float weight = (float) 0;
        Float[] weights = new Float[roots.size()];
        int i = 0;

        for (Vertex v : G.vertices())
            v.setColor(DiGraph.WHITE);

        for (Vertex v : roots) {

            weights[i]=(float) 0;
            LinkedList<Vertex> Temp= new LinkedList<Vertex>();
            Temp.add(v);


            resultTree.add(v); //For checking

            innerloop:
            for (Vertex neighbors : v.neighbors()) {
                if (neighbors.getColor() != DiGraph.BLACK) {
                    Temp.add(neighbors);
                    neighbors.setColor(DiGraph.BLACK);

                    weights[i]=weights[i]+ v.getEdge(neighbors).getWeight();

                }
                else{
                    myList[i]=null;
                    weights[i]=(float) 0;
                    break innerloop;
                }

            }
            myList[i]= Temp;

        i++;

        }

        System.out.println("# #"+resultTree);

        for (int c = 0; c < weights.length; c++)
        {

             if (weights[c] >weight)
             {
             weight = weights[c];
             resultTree = myList[c];

             }

        }


        if(resultTree.size()==0){

            return Float.NaN;
        }


        System.out.println("#  "+ resultTree);

        return weight;`

OutPut

# #[[1], [3]]
#  [[1], [4], [0]]
heaviestTree: 12.9 : [[1], [3]]

但我期待

# #[[1], [3]]
#  [[1], [4], [0]]
heaviestTree: 12.9 : [[1], [4], [0]] 

我一直在努力弄清楚我做错了什么,谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

Java 按值传递。因此,这一行

resultTree = myList[c];

不会做你认为会做的事情。让我们退一步吧。当您致电heaviestTree时,您会传递heaviest。之后发生的是LinkedList<Vertex>的引用副本。如果通过方法中的引用副本对链接列表进行更改,则它将应用于heaviest指向的实际链接列表。但是,在重新分配的情况下,它将无法工作。假设参考副本名为resultTree。上面的行将更改resultTree指向的内容,而不是heaviest指向的内容。由于在方法结束时会丢弃局部变量/副本,因此在resultTree完成后,您将无法在上一个打印语句中使用heaviestTree。这也是为什么在方法中打印时正确打印出正确树的原因。因为该链接列表是引用副本resultTree指向的链接列表,而heaviest仍然指向原始链接列表。

我对解决问题的建议,

  1. 创建一个全局LinkedList<Vertex>变量来保存最重的树
    1. 使方法返回表示最重的树的LinkedList<Vertex>