Java 递归地转换列表

Java 递归地转换列表,java,recursion,Java,Recursion,需要一些用java编写递归方法的帮助。我有以下课程- public class Node { ... private List<Node> children; --- } 通过从底部开始循环直到到达根,我可以迭代地转换列表。我试图递归地去做,但就是不能把逻辑搞清楚。 感谢您的帮助。感谢对您的方法的提示: 如果节点B然后将列表中的所有节点添加为同级节点, 如果是节点A,则将列表中的所有节点添加为子节点 它将是smthg,如下所示: private void convertL

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

public class Node {
... 
    private List<Node> children;
---
}
通过从底部开始循环直到到达根,我可以迭代地转换列表。我试图递归地去做,但就是不能把逻辑搞清楚。
感谢您的帮助。感谢对您的方法的提示:

如果节点B然后将列表中的所有节点添加为同级节点, 如果是节点A,则将列表中的所有节点添加为子节点

它将是smthg,如下所示:

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);
}
private void convertList(列表节点){
List newNodesList=newarraylist()
节点=最后一个节点
//第一次通话时,您必须进行特定的smthg
//否则
if(节点类型==A){
//将节点添加到
//向新节点添加新节点
}
else//假设只有A和B
{
//newNodesList=除最后一个节点外的节点
//将节点添加到newNodesList
}
返回convertList(NewNodeList);
}
我认为这是你思考这个问题的方式


找到停止递归的方法。

我采用了这个解决方案

    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);
private-List-convertList(列表子项、int-i、LinkedList-newNodeList){
i-=1;
如果(!(i>=0)){
返回新节点列表;
}
Node=children.get(i);
if(node.getType()=“B”){
newNodeList.addFirst(节点);
}else if(node.getType()=“A”){
儿童。移除(i);
setChildren(newArrayList(newNodeList));
newNodeList.clear();
newNodeList.addFirst(节点);
}
返回列表(children、i、newNodeList);
}

要调用此方法,请执行以下操作:-

allNodes.remove(firstNode);
LinkedList<Node> newNodeList = new LinkedList<>();
convertList(allNodes, allNodes.size(), newNodeList);
firstNode.setChildren(newNodeList)
allNodes.remove(第一个节点);
LinkedList newNodeList=新LinkedList();
convertList(allNodes,allNodes.size(),newNodeList);
firstNode.setChildren(newNodeList)

如何定义“转换”?建议:让您的
convertList
返回一个新的
List
而不是
void
。如果你试图通过操纵现有的列表来做任何事情,你会发疯的。等等,你是说你有一个工作的迭代解决方案,并且想把它转换成递归的?就像谷歌为搜索查询提供的任何方式,如“将循环转换为递归Java”?是这样的想法,即每个类型a都应该有剩余的元素作为其子元素?x23-这是正确的。我正在研究一个类似的算法。我认为解决办法更简单,我把自己弄糊涂了。我会记下这个答案。谢谢
    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)