使用递归删除元素的第一个匹配项以及链接列表中所有出现的元素

时间:2017-10-09 19:37:47

标签: java recursion linked-list

我正在尝试实现删除 deleteAll 方法,使用递归从链接列表中删除一个或多次出现的字符串,然后返回一个LLNode对象。在我的代码中,从概念上讲,我试图确定一个节点(即 node1 )是否指向出现指定元素的节点( node2 ),如果所以,让node1代替指向node2指向的节点。

我的代码大部分都有用,但我遇到的问题是它似乎跳过了列表中的第一个节点。

public class LinkedTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    LLNode<String>list = new LLNode<>("susan");
    list = addNode(list, "matt");
    list = addNode(list, "susan");
    list = addNode(list, "bob");
    list = addNode(list, "matt");

    printNodes(list);

    list = deleteAll(list, "susan");
    System.out.println("\nPrint nodes forward after delete of susan");
    printNodes(list);

    list = deleteAll(list, "matt");
    System.out.println("\nPrint nodes forward after delete of matt");
    printNodes(list);
}

public static LLNode<String> addNode(LLNode<String> list, String info) {
    LLNode<String> newNode = new LLNode<>(info);
    newNode.setLink(list);
    list = newNode;
    return list;
}

public static void printNodes(LLNode<String> node) {
    System.out.println("Print list forward");
    while (node != null) {
        System.out.println(node.getInfo());
        node = node.getLink();
    }
}

public static LLNode<String> delete(LLNode<String> node, String name){
    if(node.getLink().getInfo() != name){
        delete(node.getLink(), name);
    }
    node.setLink(node.getLink().getLink());
    return node;
}

public static LLNode<String> deleteAll(LLNode<String> node, String name){
    if(node.getLink() != null){
        deleteAll(node.getLink(), name);

        if(node.getLink().getInfo() == name){
            node.setLink(node.getLink().getLink());
        }
    }
    return node;
}

}

运行此操作时,结果如下:

Print list forward
matt
bob
susan
matt
susan

Print nodes forward after delete of susan
Print list forward
matt
bob
matt

Print nodes forward after delete of matt
Print list forward
matt
bob

在输出中,您可以看到“matt”的第一个实例尚未删除。实现 delete 方法时会出现同样的问题。 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

看到getLink().getLink()警钟响起; getLink()可能为null,特别是代码太间接,案例区别太复杂了。

字符串比较由.equals开始。

删除第一个匹配项:

public static LLNode<String> delete(LLNode<String> node, String name){
    if (node == null) { // Simplest case.
        return null;
    }
    if (node.getInfo().equals(name)) { // Actual deletion work.
        return node.getLink(); // First occurrence deleted only.
    }
    node.setLink(delete(node.getLink(), name)); // Recursion.
    return node;
}

您的代码在递归return左右之前错过了delete