递归转换列表

时间:2014-07-18 17:57:16

标签: java recursion

需要一些帮助在java中编写递归方法。我有以下课程 -

public class Node {
... 
    private List<Node> children;
---
}

有两种类型的节点。类型A和类型B.方法的输入将是一个如下所示的列表 -

1 - Type A
2 - Type B
3 - Type B
4 - Type B
5 - Type A
6 - Type B
7 - Type B
8 - Type A
9 - Type B
10 - Type B

private void convertList(List<Node> nodes) {

}

我正在编写一个方法,将列表转换为 -

1
children 2, 3, 4, 5
                  children - 6, 7, 8
                                   children - 9, 10

我可以通过从底部开始循环直到我到达根来迭代地转换。我试图递归地做,但根本无法得到逻辑。 任何帮助表示赞赏。感谢

2 个答案:

答案 0 :(得分:0)

提示您的方法:

如果节点B然后将列表中的所有节点添加为兄弟节点, 如果节点A然后将列表中的所有节点添加为子节点。

它将如下所示:

private void convertList(List<Node> nodes) {

    List<Node> newNodesList = new ArrayList<Nodes>()

    node=last node
    // you will have to do smthg specific for 1st call
    // else

    if (nodetype==A){
        //add nodes to children of A
        //add A to newNodes
    }
    else // assuming only A and B
    {
        //newNodesList=nodes except last
        //add node to the newNodesList
    }
    return convertList(newNodesList);
}

我认为你必须考虑这一点。

并找到阻止递归的方法。

答案 1 :(得分:0)

我选择了这个解决方案

    private List<Node> convertList(List<Node> children, int i, LinkedList<Node> newNodeList) {
    i -= 1;
    if (!(i >= 0)) {
        return newNodeList;
    }
    Node node = children.get(i);
    if (node.getType() == "B") {
        newNodeList.addFirst(node);
    } else if (node.getType() == "A") {
        children.remove(i);
        node.setChildren(new ArrayList<>(newNodeList));
        newNodeList.clear();
        newNodeList.addFirst(node);
    }
    return convertList(children, i, newNodeList);

}

要调用此方法,请执行 -

allNodes.remove(firstNode);
LinkedList<Node> newNodeList = new LinkedList<>();
convertList(allNodes, allNodes.size(), newNodeList);
firstNode.setChildren(newNodeList)