Метод печати Для Java LinkedQueue не получает фронтальное значение - PullRequest
0 голосов
/ 11 апреля 2020

Я реализовал LinkedQueue в Java. Это моя собственная реализация, она не расширяет классы и не реализует интерфейсы (требования проекта). Однако мой метод печати не возвращает первый элемент в очереди. Есть идеи почему?

Класс ListNode

public class ListNode<AnyType> {
    public ListNode( AnyType theElement ) {
            this( theElement, null );
        }
    public ListNode( AnyType theElement, ListNode<AnyType> n) {
        element = theElement; next = n;
        }

    public AnyType element;
    public ListNode next;
}

Класс LinkedQueue

public class LinkedQueue <AnyType> {
    private ListNode<AnyType> front;
    private ListNode<AnyType> back;


    LinkedQueue() {
        front = back = null;
    }

    public void enqueue ( AnyType x ) {
        if ( isEmpty()) 
            back = front = new ListNode<AnyType>(x);
        else back = back.next = new ListNode<AnyType>(x);
    }
public LinkedQueueIterator<AnyType> first() {
        return new LinkedQueueIterator<AnyType>(front.next);
    }

    public static <AnyType> void printList(LinkedQueue theList) {
        if (theList.isEmpty()) {
            System.out.println("Empty List");
        } else {
            LinkedQueueIterator<AnyType> itr = theList.first();
            for( ; itr.isValid(); itr.advance()) {
                System.out.print( itr.retrieve() + " ");
            }
        }
    }

Класс LinkedQueueIterator

public class LinkedQueueIterator<AnyType> {
    ListNode<AnyType> current;
    LinkedQueueIterator(ListNode<AnyType> theNode) {
        current = theNode;
    }

    public boolean isValid(){
        return current != null;
    }

    public AnyType retrieve(){
        return isValid() ? current.element : null;
    }

    public void advance() {
        if( isValid())
            current = current.next;
    }


}

Я действительно могу ' Я не вижу в этом ничего плохого, но если я сделаю LQ.enqueue ("A"), LQ.enqueue ("B"), LQ.enqueue ("C") и вызову printList, все, что я получу, это B C

1 Ответ

0 голосов
/ 11 апреля 2020

Посмотрев некоторое время на вашу кодировку, просто из-за вашей маленькой ошибки ваш метод first() возвращает элемент после переднего элемента, вот в этом фрагменте кода:

public LinkedQueueIterator<AnyType> first() {
        return new LinkedQueueIterator<AnyType>(front.next);
}

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

public LinkedQueueIterator<AnyType> first() {
        return new LinkedQueueIterator<AnyType>(front);
}

Теперь ваша программа должна работать правильно.

...