有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java递归地从LinkedList中查找并删除节点

给定一个要搜索的字符串,我想编写一个只接受一个参数(要搜索的字符串)的递归函数。该函数将递归搜索该值,如果找到该值,它将删除该项并返回它。如果没有找到,函数将到达列表的末尾并返回null。到目前为止,我认为我的想法是正确的,只是它运行不正常:

主要测试类别

public static void main(String[] args) {
    RecLinkedList list = new RecLinkedList();
    list.add("A");
    list.add("B");
    list.add("D");
    list.add("C", 2);
    list.add("E", 4);
    list.add("G", 6); //this should be invalid

    System.out.println( list );
    System.out.println( list.remove( 1 ).getValue() );
    System.out.println( list.remove("D").getValue() );
    System.out.println( list.remove("G").getValue() );
    System.out.println( list.size() );
    System.out.println( list );
}

链表类(仅显示我需要的帮助)

public class RecLinkedList {
private Node first;
private int size = 0;

public RecLinkedList(){
    first = null;
}
public boolean isEmpty() {
    return first == null;
}
public Node remove( String s ){
    return remove( s, 0, first );
}
private Node remove( String s, int count, Node list ){
    if( list == null ){
        return null;
    }else if( s.equals(s) ){
        first = list.getNext();
        return list;
    }else if( s.equals(count+1) ){
        Node n = list.getNext();
        if( list.getNext() != null ){
            list.setNext( list.getNext().getNext() );
        }
        return n;
    }else{
        return remove( s, count+1, list.getNext() );
    }
}

到目前为止,我能够删除该项目,但截至目前,项目“A”正在被删除时,它不应该被删除。最后的列表应该是A,C,E(G应该返回并打印null,因为它不存在)。我想我离得很近,但有点小问题,但我似乎想不出来


共 (2) 个答案

  1. # 1 楼答案

    代码中有几个错误(请参阅下面的注释):

    private Node remove( String s, int count, Node list ){
        if( list == null ){
            return null;
        }else if( s.equals(s) ){ // comparing s to itself means you always remove
                                 // the first element from the list (since this
                                 // condition is always true)
            first = list.getNext();
            return list;
        }else if( s.equals(count+1) ){ // comparing the String s to an int - makes
                                       // no sense, will never be true
            Node n = list.getNext();
            if( list.getNext() != null ){
                list.setNext( list.getNext().getNext() );
            }
            return n;
        }else{
            return remove( s, count+1, list.getNext() );
        }
    }
    
  2. # 2 楼答案

    在我看来,你的问题似乎有些模棱两可。我知道你的方法应该搜索一个元素,删除它(如果存在),然后返回相同的对象。如果元素不存在,则该方法应返回null。这看起来很简单,因为大多数实用程序方法都已经在LinkedList中实现了。因此,我建议延长该课程:

    public class RecLinkedList<E>
        extends LinkedList<E>
    {
        public E removeAndReturn(E element)
        {
            E result;
            if (this.contains(element)) {
                remove(element);
                result = element;
            }
            else {
                result = null;
            }
            return result;
        }
    }
    

    我不明白你为什么想要递归地实现这个

    这显然可以写得更简洁,但如果有其他明确的选项,应该会更清楚

    编辑:更简洁、可能更好的实现方式是:

    public E removeAndReturn(E element)
    {
        return remove(element) ? element : null;
    }