2015-07-20 1 views
1

Я пытаюсь реализовать LinkedList с нуля и имея проблемы с пониманием метода deleteFirst(), который удаляет первый Link в списке. Почему мне нужно сохранить ссылку firstLink на временный объект Link, а затем вернуть его? Я не понимаю, почему мне нужно назначить firstLink ссылку на объект temp, а затем вернуть его, но откуда он возвращает следующий объект Link? Почему я не могу это сделать?Зачем мне записывать первый элемент при удалении в связанном списке?

firstLink = firstLink.next; 
return firstLink 

Класс Link:

public class Link { 

    public String bookName; 
    public int quantity; 

    public Link next; 

    public Link(String bookName, int quantity){ 
     this.bookName = bookName; 
     this.quantity = quantity; 
     this.next = null; 
    } 

    public void display(){ 
     System.out.println("The number of " + bookName + " is " + quantity); 
    } 
} 

class LinkedList{ 

    public Link firstLink; 

    public LinkedList(){ 
     this.firstLink = null; 
    } 

    public boolean isEmpty(){ 
     return (firstLink == null); 
    } 

    public void insertLink(String bookName, int quantity){ 
     Link newLink = new Link(bookName, quantity); 
     newLink.next = firstLink; 
     firstLink = newLink; 
    } 

    public Link deleteFirst(){ 
     if(this.isEmpty()){ 
      System.out.println("The list is empty!"); 
     } 
     else{ 
      Link temp = firstLink; 
      firstLink = firstLink.next; 
      return temp; 
     } 
     return null; 
    } 
} 
+0

Что бы ваше предложение вернулось? Каким должен быть метод? –

ответ

2

В начале, ваш список выглядит следующим образом (концептуально)

1 2 3 
^ 
| 
| 
firstLink 

Затем вы выполняете firstLink = firstLink.next, так что теперь выглядит следующим образом:

1 2 3 
    ^
    | 
    | 
    firstLink 

Если вы делаете return firstLink;, вы вернетесь 2. Однако вы хотите вернуть удаленный элемент, который равен 1.

Это выглядит так, после Link temp = firstLink:

1 2 3 
^ 
| 
| 
firstLink AND temp 

Затем firstLink = firstLink.next:

1  2  3 
^  ^
|  | 
|  | 
temp firstLink 

Из-за временной переменной, мы сохраняем ссылку на 1 даже после того, как он был удален.

+0

Я собирался ответить, но это подводит итог. Еще одна вещь заключается в том, что у вас есть возможность сохранить или обработать элемент после его удаления. В вашем коде нет ничего плохого, просто, как вы хотите его реализовать. –

+1

@ durron597, конечно, я приму это. Я должен ждать из-за минут ожидания, чтобы принять ответ (4 минуты осталось :)). –

1

Метод deleteFirst() имеет 2 обязанности

  1. Чтобы удалить 1-й элемент списка.
  2. Чтобы вернуть удаленный объект

Это потому, что LinkedList реализует Deque и те правила, установленные им. Если вы не храните его в переменной temp, вы не сможете его вернуть.

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