我有一个带有子节点列表的节点模型,如下所示:
class Node {
private String name;
private List<Node> childNodes;
public Node(String name, List<Node> childNodes) {
this.name = name;
this.childNodes = childNodes;
}
public Node(String name) {
this(name, new ArrayList<>());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Node> getChildNodes() {
return childNodes;
}
public void setChildNodes(List<Node> childNodes) {
this.childNodes = childNodes;
}
public void addChildNodes(Node childNode) {
this.getChildNodes().add(childNode);
}
}
我要做的是检查将子节点添加到父节点时是否产生循环。此处的循环意味着子节点与其直接或间接父节点具有相同的名称。当检测到循环时,我还想打印出哪些节点是该循环中的内容。到目前为止我所做的是:
private static void findLoop(Node currentNode, String orginalNodeName, String visitedNode) {
if (currentNode != null && !currentNode.getChildNodes().isEmpty()) {
for (Node childNode : currentNode.getChildNodes()) {
visitedNode = visitedNode + "->" + childNode.getName();
if (childNode.getName().equals(orginalNodeName)) {
System.out.println("Loop is detected: " + visitedNode);
}
findLoop(childNode, orginalNodeName, visitedNode);
}
}
}
我的想法是遍历所有子节点,从我要检查的节点开始,比较当前节点是否与原始起始节点同名,如果是则检测到循环。
它可以工作,但我无法正确打印循环的内容,因为它循环遍历父节点的所有可能子节点,例如:
parentNode
node1 node2
childNode1 childNode2
parentNode childChildNode2
它打印了:parentNode->node1->node2->childNode2->parentNode
我想打印的是:parentNode->node2->childNode2->parentNode
有人可以在这里给我一些提示吗?太感谢了!