2015-04-09 7 views
0

Учитывая строку для поиска, я хочу написать рекурсивную функцию, которая принимает только один параметр (строка для поиска). Функция будет искать значение рекурсивно, и если оно будет найдено, оно удалит элемент и вернет его. Если он не будет найден, функция достигнет конца списка и вернет значение null. То, что я до сих пор я думаю, что это правильная идея кроме него не функционирует должным образом:Рекурсивно найти и удалить узел из LinkedList

Main Test Class

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, C, E. (G должен возвращать и печатать null, потому что он не существует). Я думаю, что я рядом, но что-то второстепенное, но я не могу понять это.

+0

'} еще если (s.equals (s)) {' это кажется подозрительным мне. Он всегда будет «true», а следующий 'else if (...)' никогда не будет выполнен. Также '} else if (s.equals (count + 1)) {', вероятно, не то, что вы хотите. Вы сравниваете индекс (исправьте меня, если я ошибаюсь) со строкой для поиска. – Turing85

ответ

0

Есть несколько ошибок в коде (см комментарии ниже):

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()); 
    } 
} 
0

Мне кажется, что есть некоторая неясность в вашем вопросе. Я понимаю, что ваш метод должен искать элемент, удалять его, если он есть, и возвращать тот же объект. Если элемент отсутствует, метод должен возвращать значение 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; 
    } 
} 

Я не понимаю, почему вы хотели бы реализовать это рекурсивно.

Это может быть явно написано более кратко, но явное if-else должно сделать его более ясным.

EDIT: Чем более кратким и, вероятно, лучше реализация будет:

public E removeAndReturn(E element) 
{ 
    return remove(element) ? element : null; 
} 
Смежные вопросы