[英]Search Double Linked List Java Recursively
我试图在Java中搜索双向链接列表中的一个词,如果找到,则将其返回。 到目前为止,这是我的代码:
private class Node {
public String content;
public Node up;
public Node left;
public Node right;
}
private Node searchList(String term, Node node) {
while (node != null) {
System.out.print(node.name + " - "); //To see process
if (node.content.equals(term)) {
return node;
} else if (node.right != null) {
return searchList(term, node.right);
}
node = node.left;
}
return null;
}
我的算法基本上是:
抱歉,对我的问题进行编辑:无法搜索到最低级别,并且无法理解我哪里出了问题。
任何帮助,将不胜感激!
我认为您的算法多次计算同一节点,因为向左移动并反复找到左节点的所有右节点。
您可以通过从起始节点搜索两个方向来找到节点。
private Node internalSearchList(String term, Node node, int direction) {
if (node == null) {
return null;
}
if (term.equals(node.content)) {
return node;
} else {
return internalSearchList(term, direction == 0 ? node.left : node.right, direction);
}
}
private Node searchList(String term, Node node) {
// search to left side
Node result = internalSearchList(term, node, 0);
if (result != null) {
return result;
} else {
return internalSearchList(term, node, 1);
}
}
我也认为Node.left和Node.right的类型必须是Node。
private class Node {
public String content;
public Node up;
public Node left;
public Node right;
}
我同意你的问题不清楚的评论。 但是,我假设您只是在寻找一种在双链表上实现递归搜索的方法(不允许使用null元素)。 正如其他答案已经提到的那样,我假设类型Page是Node的子类型。 实际上,我将在下面的示例中替换它。
由于对于实现双重链接列表和递归本身似乎存在一些误解,因此,我将提供一个简洁但有效的示例。
您提供的代码缺少递归的终止条件。 不幸的是,这也适用于ikicha的解决方案。 实现此目的的一种方法(其中之一)是使用辅助方法将不变量(例如start元素)或计数器从递归的一次迭代传递到下一个迭代。
在示例中,行node = node.left
无效。 如果您想双向搜索(如ikicha所示),我将对为什么方向对您很重要感兴趣。
public class DoubleLinked {
private Node first;
private Node last;
private int size;
private class Node {
public String content;
public Node left;
public Node right;
public Node(String content) {
this.content = content;
}
}
private void addElement(Node addedNode) {
if (first == null) {
first = addedNode;
last = addedNode;
} else {
last.right = addedNode;
addedNode.left = last;
addedNode.right = first;
last = addedNode;
}
size++;
}
private Node searchList(String term, Node node) {
int tries = 0;
if (node != null) {
return searchHelper(term, node.right, tries);
}
return null;
}
private Node searchHelper(String term, Node node, int tries) {
if (node == null || tries >= size) {
return null;
}
if (node.content.equals(term)) {
return node;
} else {
return searchHelper(term, node.right, tries);
}
}
public static void main(String[] args) {
DoubleLinked list = new DoubleLinked();
list.addElement(list.new Node("first"));
Node startNode = list.new Node("second");
list.addElement(startNode);
list.addElement(list.new Node("third"));
list.addElement(list.new Node("forth"));
Node r = list.searchList("forth", startNode);
System.out.println(r!=null?r.content:"term not found");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.