2013-11-30 2 views
1

Здравствуйте, я не смог выполнить свое задание, потому что мне было сложно выяснить, как настроить метод поиска в моем связанном списке. Теперь я все еще хочу узнать, как настроить связанный список, и я не можете сделать любой из других методов, таких как удаление, или заменить, если я не могу определить метод поиска. по какой-то причине мои результаты продолжают оказываясь нуль Это то, что я до сих пор ..Метод поиска связанного списка Java

public class WordList { 
private WordMeaningNode list; 
WordList() 
{ 
    list = null; 
} 
void add(WordMeaning b) 
{ 
    WordMeaningNode temp = new WordMeaningNode(b); 
    try 
    { 
     temp.Next = list; 
     list = temp; 
    } 
    catch(NullPointerException e) 
    { 
     System.out.println("Null Pointer Exception"); 
    } 
} 
public String toString() 
{ 
    String result=""; 
    WordMeaningNode current = list; 
    while (current != null) 
    { 
     result += current.Words.word + " - " + current.Words.meaning + "\n"; 
     current = current.Next; 
    } 
    return result; 
} 
public WordMeaning findword (WordMeaning Word) 
{ 

    WordMeaningNode Checker = new WordMeaningNode(Word); 

    boolean found = false; 

    if (list.isEmpty() == true) 
    { 
     return null; 
    } 
    else 
    { 
     while(list.Next != null && !found) 
     { 
      if(list.Words.word.compareTo(Checker.Words.word)== 0) 
      { 
       found = true; 
      } 
      else 
      { 
       list = list.Next; 
       found = false; 
      } 
     } 
    } 
    if(found == true) 
    { 
     return list.Words; 
    } 
    else 
    { 
     return null; 
    } 
} 
+2

Вы изменяете значение 'list' внутри вашего метода поиска. Вы не должны этого делать. Вы также должны прочитать соглашения об именах Java и придерживаться их. –

+0

Тем не менее, метод toString не приведет к ошибке с нулевым указателем для моего теста для тестов класса тестера, если возвращаемое значение равно нулю. – Xavier

+0

@JBNizet. Обычно я этого не делаю, но это последнее, что я пытался увидеть, если это работает, но ничего не работает, и я думаю, что мой метод поиска - это найти, я просто не знаю, что не так. – Xavier

ответ

2

Вы версия фактически изменяет (узел, который на самом деле корень (или первый) вашего списка) list себя в каждой итерации который разбивает список. Ваш метод запроса не должен изменять сам список. Просто используйте временную переменную (локальный) узел (шахта называется current) в цикле в то время как вместо того, чтобы, например, так:

public WordMeaning findWord (WordMeaning word) 
{ 
    if (list.isEmpty()) 
    { 
     return null; 
    } 

    boolean found = false; 
    WordMeaningNode current = list; 
    while(current != null) 
    { 
     if(current.Words.word.compareTo(word)== 0) 
     { 
      found = true; 
      break; 
     } 
     current = current.Next; 
    } 
    return current; 
} 
+0

Итак, проблема в том, что мой цикл while не является оператором if за пределами правильного цикла? ... ладно, теперь это из-за части «&&! Found», которая испортила мой цикл, потому что я думаю, что часть будет выполнять те же роли, что и «перерыв», который у вас есть в вашем коде – Xavier

+0

. Вы правы, разрыв устраняет необходимость проверки на наличие найденного. [Эта тема] (http://programmers.stackexchange.com/questions/58237/are-break-and-continue-bad-programming-practices) обсуждает преимущества использования break и продолжения. – Domi

+0

Вы не можете вернуть текущий, потому что текущий - это WordMeaningNode .. но я понимаю, что вы говорите, что мое замешательство заключается в том, что мой код делает то же самое еще немного дольше. – Xavier

1

Это пример того, как найти элемент в связанном списке:

public class LinkedList<T> { 

    private LinkedList<T> next; 
    private T data; 

    public LinkedList(T value) { 
     data = value; 
    } 

    public LinkedList<T> next() { 
     return next; 
    } 

    public T value() { 
     return data; 
    } 

    public void setNext(LinkedList<T> element) { 
     next = element; 
    } 

    public void setValue(T value) { 
     data = value; 
    } 
} 

public LinkedList<Integer> find(LinkedList<Integer> head, int data) { 
    LinkedList<Integer> elem = head; 
    while (elem != null && elem.value() != data) { 
     elem = elem.next(); 
    } 
    return elem; 
} 
Смежные вопросы