以递归方式搜索双链表Java

时间:2017-03-10 15:48:44

标签: java recursion linked-list doubly-linked-list

我正在尝试在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;
}

我的算法基本上是:

  • 节点不为空
  • 检查它是否与搜索字词匹配
  • 如果右边有一个元素,请使用递归扫描
  • 两个点现在都为空,项目不存在

用我的问题编辑,抱歉: 我无法深入了解底层并无法理解我出错的地方。

任何帮助将不胜感激!

2 个答案:

答案 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");
}
}