2017-01-09 3 views
1

У меня есть эта часть кода. Это синтаксически правильно, но когда я пытаюсь удалить узел с фронта, он говорит: «Список пуст». Я считаю, что моя ошибка в методе isEmpty, потому что он возвращает неправильное значение, но я не знаю почему.Связанный список удалить

Не могли бы вы помочь мне определить, почему?

Вот мой код:

public class link { 
    public String bookName ; 
    public int millionSold; 

    public link next ; 

    public static void main(String [] args) 
    { 
     linkList linkedlist = new linkList(); 
     linkedlist.insertLink("Head first java", 200); 
     linkedlist.insertLink("Head first design pattern", 400); 
     linkedlist.insertLink("Head first design", 600); 
     linkedlist.display(); 
     System.out.println(linkedlist.isEmpty()); 
     linkedlist.findItem("Abed"); 
    } 

    public void display() 
    { 
     System.out.println(bookName +":"+millionSold+"000.000"); 
    } 

    public link(String bookName,int millionSold) 
    { 
     this.bookName=bookName; 
     this.millionSold=millionSold; 
    } 
    public String toString() 
    { 
     return bookName ; 
    } 
} 

Linklist

class linkList 
{ 
    public link firstLink ; 

    linkList() 
    { 
     firstLink = null ; 
    } 

    public boolean isEmpty() 
    { 
     boolean empty ; 
     if(firstLink==null) 
     { 
      empty = true ; 
     } 
     else 
     { 
      empty = false ; 
     } 
     return empty; 
    } 

    public void insertLink(String bookName , int millionSold) 
    { 
     link newLink = new link(bookName,millionSold); 

     newLink.next = firstLink; 
     firstLink=newLink ; 
    } 
    public link removeLink() 
    { 
     link linkReference = firstLink ; 
     if(!isEmpty()) 
      linkReference.next= firstLink; 
     else 
      System.out.println("The List is Empty"); 

     return linkReference ; 
    } 

    public void display() 
    { 
     while(firstLink!=null) 
     { 
      firstLink.display(); 
      System.out.println("The Next :"+firstLink.next); 
      firstLink = firstLink.next; 
      System.out.println(); 
     } 
    } 

     public link findItem(String bookName) 
     { 
      if(!isEmpty()) 
      { 
       while(firstLink.bookName != bookName) 
       { 
        if(firstLink.next == null) 
        { 
         return null ; 
        } 
        else 
        { 
         firstLink=firstLink.next; 
        } 
       } 
      } 
      else 
      { 
       System.out.println("Can not find a match"); 
      } 
      return firstLink ; 
     } 
    } 
+0

приведен выше, просто прокрутите вниз, чтобы увидеть весь код, пожалуйста –

+0

Вероятно, это связано с тем, что вы модифицируете поле 'firstLink' в некоторых методах, которые по моему скромному мнению не имеют бизнеса, изменяющего состояние ваш список ('display' и' findItem') –

ответ

0

В removeLink уступка linkReference.next= firstLink; назначен firstLink к linkReference.next где Infact вы хотите наоборот. Вы хотите firstLink быть linkReference.next так попробуйте изменить firstLink=linkReference.next;

Еще одно наблюдение находится в display и findItem не используют firstLink как вы изменяя указатель на свой список (ваш только точки входа), как вы запустите метод.

+0

он дал тот же результат, проверьте isEmpty метод Ошибка есть, но я не могу понять это –

+0

Вы обновили метод 'display' и' findItem', а также объяснили в ответ? –

+0

он работал при обновлении, как вы упомянули выше. другой вопрос здесь я обновил, но у меня есть недоразумение , когда мне нужно использовать значение temp для firstlink в каждый раз, когда я хочу использовать его среди этих методов? –

0

Используйте временную переменную (cursor ниже) для навигации по вашему списку. В противном случае вы определяете значение null для firstLink, и кажется, что список пуст.

public void display() 
{ 
    link cursor = firstLink; 
    while(cursor!=null) 
    { 
     cursor.display(); 
     System.out.println("The Next :"+cursor.next); 
     cursor = cursor.next; 
     System.out.println(); 
    } 
} 

и делать то же самое, когда вы хотите перебрать список (напр. findItem()) будет более эффективным подходом.

0

Проблема в вашем методе display(). Вы перебираете список и после этого переменная firstLink становится пустой. Вы должны добавить временную переменную только для итераций в методе отображения(), например:

link tempLink = firstLink; 
while (tempLink != null) { 
    tempLink.display(); 
    System.out.println("The Next: " + firstLink.next); 
    tempLink = tempLink.next; 
    System.out.println(); 
} 

использовать ту же технику в других местах, где вы итерацию по списку, но не хотят менять головку (например, метод findItem()).

Я бы также рекомендовал использовать имя класса для всех классов в Java. Вы можете узнать больше о Java naming conventios here.

Смежные вопросы