遍历列表以将字符添加到Java中的字符串列表中

提问

我正在尝试创建一种返回字符串的链表的方法.有一棵树,树中的每个节点都存储一个字符.该方法应该找到通过树的所有可能路径.每个路径都会创建一个字符串,并将其添加到列表中.

在第二个for循环中似乎有一个我无法解决的问题.该方法仅返回在第一个if语句中添加的字符.

每个节点都包含变量childList(这是子节点的链接列表)和nodevalue(其是节点存储的字符).

public LinkedList<String> findStrings() {
    LinkedList<String> paths = new LinkedList<String>();
    //add character to list if there are no children
    if (childList.isEmpty()){
        paths.add("" + nodevalue);
        return paths;
    }
    //use recursion to add paths from all children to the list
    for (TreeNode t : childList){
        paths.addAll(t.findStrings());
        //add nodevalue to the beginning of all strings in the list
        for (String s : paths){
            s = nodevalue + s;
        }
    }
    for (String s : paths) System.out.println(s); //for debugging
    return paths;
}

最佳答案

在内部循环中更改s时,您只是在重新分配变量s,而不是重新分配存储在链接列表中的值.相反,您应该遍历列表中的所有元素,并逐一更新它们.我认为这样的事情应该起作用:

//use recursion to add paths from all children to the list
for (TreeNode t : childList){
    paths.addAll(t.findStrings());
    //add nodevalue to the beginning of all strings in the list
    int length = paths.size();
    for (int i=0; i<length; i++) {
        paths.offer(nodevalue + paths.poll());
    }
}

poll从列表的最前面开始选择第一项,而要约则将结果放在后面.您将第一个项目取下,进行更改,然后将其放置在背面,重复path.size()次,最后以原始顺序得到更新的项目.

评论