2017-10-09 84 views
0

我想实现一个删除deleteAll方法来删除一个事件或从我的连接字符串的所有出现列表使用递归,然后返回一个LLNode对象。在我的代码,我,概念,试图找出如果一个节点(即节点1)指向与指定的元素(节点2)的出现的节点,如果是这样,有节点1改为指向节点时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 

在输出中可以看到,“马特”的第一个实例没有被删除。执行删除方法时会发生同样的问题。 任何帮助,非常感谢!

回答

1

眼看getLink().getLink()警钟应环; getLink()可能为空,特别是代码太间接,这种情况区分太复杂。

字符串比较的推移.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; 
} 

你的代码的意图是递归delete左右之前缺少return

+0

我试图实施之前与此类似,但什么绊倒了我是递归调用的位置。这更有意义,谢谢! – Mac

+0

另外,我是能够赶上这一点,但在这两个的LLNode参数和字符串参数_delete_需要;我添加了_name_作为String参数,并且完美地工作。 – Mac

+0

更正为其他读者。 –

相关问题