2017-01-03 4 views
1

, если я поддерживаю ссылку the least added item, но не поддерживает ссылку most recently added, то у меня будет постоянное время "dequeue" и линейное время "enqueue". поэтому это моя программа, которая реализует очередь в java-связанном списке. Я хочу спросить, поддерживает ли эта программа как наименее добавленный элемент, так и последний добавленный элемент? так что это все постоянное время, когда я "dequeue" или "enqueue"? Спасибо!о линейном времени и постоянном времени реализации очереди по связанному с java списку

add: Я согласен с тем, что сказал первый ответ, поэтому я попробовал режим отладки, и он показывает, что старая версия не обновилась после последнего изменения, так что она все еще работает ... но из теории ссылок я узнал от uni , так же, как он сказал, он не должен работать .. Любой человек может сказать мне, почему он не обновляется автоматически? (моя ява версия 1,8)

package tst; 

public class linkedlsqueue { 

    private class Node { 
     String item; 
     Node next; 
    } 

    Node first, last; 

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

    public void enqueue(String item) { 
     Node oldlast = last; 
     last = new Node(); 
     last.item = item; 
     if (isEmpty()) { 
      first = last; 
     } 
     else { 
      oldlast.next = last; 
     } 
    } 

    public String dequeue() { 
     String item = first.item; 
     first = first.next; 
     if (isEmpty()) { 
      last = null; 
     } 
     return item; 
    } 



} 

ответ

2

Да, вы правы. Он является постоянным для обоих случаев.

Это хорошая идея, чтобы вести учет какfirst и last для связанного списка.
Кто-то назовет его head и tail.

Если вы только поддерживать один из last или first, вы должны искать другую итерацию first в last найти другой или наоборот - один на один элемент, который является O (п).

Как будто вы находитесь в темноте.
Вы держите конец веревки, и вы хотите знать, к чему это приведет.
Я не могу думать о других путях прослеживания этой веревки. Требуется O (n) для отслеживания.

Я предпочитаю использовать массив [].
С массивом, это похоже на то, что у вас есть карта, солнце и суперпортал (произвольный доступ).
Однако это не входит в вопрос.

+0

просто точка: в списке, хвост все за голову – Daniel

+1

@ Daniel не согласен. После быстрого поиска: http://www.studytonight.com/data-structures/queue-data-structure – javaLover

+1

hmm ... Когда я впервые узнал, что haskell, я делал рекурсии в списках вроде этого: что-то делать с головой и вызовите рекурсию к хвосту (который был остальной частью списка). Я тоже называл последний элемент хвостом, но потом я подумал, что это неправильно ... может быть, я должен просто принять оба :) – Daniel

1

Идея правильная, но реализация неправильная.

Посмотрите на это:

public void enqueue(String item) { 
    Node oldlast = last; 
    last = new Node(); 
    last.item = item; 
    if (isEmpty()) { 
     first = last; 
    } 
    else { 
     oldlast.next = last; 
    } 
} 

когда вы делаете oldlast = last, вы НЕ КОПИРОВАТЬ в last, вы просто передать last ссылку на oldlast.

В течение всего процесса oldlast будет любым last. И в то же время вы RESET значения last, когда вы делаете last = new Node().

, если вы просто хотите епдиеие, правильный метод может работать следующим образом:

public void enqueue(String item) { 
    Node newNode = new Node(); 
    newNode.item = item; 
    if(isEmpty()){ 
     first = newNode; last = newNode; 
     return; 
    } 
    this.last.next = newNode; 
    this.last = newNode; 
} 

правильно скопировать элемент, вы должны сделать:

Node oldlast = new Node(); 
oldlast.item = String(last.item); 

надежду, что помогает.

+0

Вы копаете его код! так добросовестно +1 – javaLover

+0

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

+0

странно ... может быть, компилятор покидает старый узел в памяти и создает новый в другом месте – Daniel

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

  • Нет связанных вопросов^_^