我正在尝试实现删除和 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 方法时会出现同样的问题。 非常感谢任何帮助!
答案 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
。