我正在尝试在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;
}
我的算法基本上是:
用我的问题编辑,抱歉: 我无法深入了解底层并无法理解我出错的地方。
任何帮助将不胜感激!
答案 0 :(得分:0)
我认为你的算法会多次计算同一节点,因为向左移动并重复找到左边节点的所有正确节点。
您可以通过从起始节点搜索两个方向来找到节点。
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;
}
答案 1 :(得分:0)
我同意你的问题不明确的评论。 但是,我假设您只是在寻找一种在双链表上实现递归搜索的方法(其中不允许使用null元素)。正如另一个答案已经提到的那样,我假设类型Page是Node的子类型。事实上,我将在下面的例子中替换它。
由于似乎有一些关于实现双链表和关于递归本身的误解,我将给出一个精简但正在运行的例子。
您呈现的代码缺少递归的终止条件。不幸的是,这也适用于ikicha的解决方案。实现此目的的一种方法(使用其他方法)是使用辅助方法将递归的一次迭代中的不变量(例如,起始元素)或计数器传递给下一次。
示例中的行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");
}
}