繁体   English   中英

递归搜索Java的双链表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM