Java итерация по последовательности двусвязных списков

#java

#java

Вопрос:

Я пытаюсь написать итеративный метод для получения последнего вагона последовательности поездов. Но я застрял на том, как это сделать. Кто-нибудь может помочь мне в правильном направлении?

Метод:

 /**
     * finds the last wagon of the sequence of wagons attached to this wagon
     * if no wagons are attached return this wagon itselve
     * @return  the wagon found
     */
    public Wagon getLastWagonAttached() {
        // TODO provide an iterative solution (without recursion)
        if (!hasNextWagon()){
            // return the wagon
        }
        else {
            // move to next wagon
        }

        return null; // return the last wagon
    }
  

для дополнительного это весь класс:

 public abstract class Wagon {

    protected int id;                 // some unique ID of a Wagon
    private Wagon nextWagon;        // another wagon that is appended at the tail of this wagon
                                    // a.k.a. the successor of this wagon in a sequence
                                    // set to null if no successor is connected
    private Wagon previousWagon;    // another wagon that is prepended at the front of this wagon
                                    // a.k.a. the predecessor of this wagon in a sequence
                                    // set to null if no predecessor is connected


    // representation invariant propositions:
    // tail-connection-invariant:   wagon.nextWagon == null or wagon == wagon.nextWagon.previousWagon
    // front-connection-invariant:  wagon.previousWagon == null or wagon = wagon.previousWagon.nextWagon

    public Wagon (int wagonId) {
        this.id = wagonId;
    }

    public int getId() {
        return id;
    }

    public Wagon getNextWagon() {
        return nextWagon;
    }

    public Wagon getPreviousWagon() {
        return previousWagon;
    }

    /**
     * @return  whether this wagon has a wagon appended at the tail
     */
    public boolean hasNextWagon() {
        return this.nextWagon != null;
    }

    /**
     * @return  whether this wagon has a wagon prepended at the front
     */
    public boolean hasPreviousWagon() {
        return this.previousWagon != null;
    }

    /**
     * finds the last wagon of the sequence of wagons attached to this wagon
     * if no wagons are attached return this wagon itselve
     * @return  the wagon found
     */
    public Wagon getLastWagonAttached() {
        // TODO provide an iterative solution (without recursion)
        if (!hasNextWagon()){
            // return the wagon
        }
        else {
            // move to next wagon
        }

        return null; // return the last wagon
    }

    /**
     * @return  the length of the sequence of wagons starting with this wagon
     *          return 1 if no wagons have been attached to this wagon.
     */
    public int getSequenceLength() {
        // TODO provide a recursive solution

        return 1;
    }

    /**
     * attaches this wagon at the tail of a given prevWagon.
     * @param newPreviousWagon
     * @throws RuntimeException if this wagon already has been appended to a wagon.
     * @throws RuntimeException if prevWagon already has got a wagon appended.
     */
    public void attachTo(Wagon newPreviousWagon) {
        // TODO verify the exceptions

        // TODO attach this wagon to its new predecessor (sustaining the invariant propositions).
    }

    /**
     * detaches this wagon from its previous wagons.
     * no action if this wagon has no previous wagon attached.
     */
    public void detachFromPrevious() {
        // TODO detach this wagon from its predecessors (sustaining the invariant propositions).

    }

    /**
     * detaches this wagon from its tail wagons.
     * no action if this wagon has no succeeding next wagon attached.
     */
    public void detachTail() {
        // TODO detach this wagon from its successors (sustaining the invariant propositions).

    }

    /**
     * attaches this wagon at the tail of a given newPreviousWagon.
     * if required, first detaches this wagon from its current predecessor
     * and/or detaches the newPreviousWagon from its current successor
     * @param newPreviousWagon
     */
    public void reAttachTo(Wagon newPreviousWagon) {
        // TODO detach any existing connections that will be rearranged

        // TODO attach this wagon to its new predecessor (sustaining the invariant propositions).

    }

    /**
     * Removes this wagon from the sequence that it is part of, if any.
     * Reconnect the subsequence of its predecessors with the subsequence of its successors, if any.
     */
    public void removeFromSequence() {
        // TODO

    }


    /**
     * reverses the order in the sequence of wagons from this Wagon until its final successor.
     * The reversed sequence is attached again to the predecessor of this Wagon, if any.
     * no action if this Wagon has no succeeding next wagon attached.
     * @return the new start Wagon of the reversed sequence (with is the former last Wagon of the original sequence)
     */
    public Wagon reverseSequence() {
        // TODO provide a recursive implementation

        return null;
    }

    // TODO
}
  

Комментарии:

1. Что такое универсал?

2. У меня нет проблем с тем, чтобы помогать людям с их домашней работой, но работать не с чем, кроме того, что было предоставлено профессором здесь. Если вы сделаете хорошую, честную попытку и сообщите нам, какая у вас проблема, это будет намного эффективнее!

3. Я думаю, что у других было бы больше соблазна помочь вам, если бы вы попытались написать какой-то код самостоятельно. В настоящее время у вас есть метод, который необходимо реализовать, и, похоже, вы хотите, чтобы кто-то другой написал его за вас. Для итерации по связанному списку используйте while цикл, который выполняется до тех пор, пока текущее wagon.nextWagon значение не станет нулевым. Когда цикл остановится, вы будете последним wagon . Попробуйте реализовать это самостоятельно, и если вы все еще не можете этого сделать, отредактируйте свой вопрос с помощью вашего кода.

Ответ №1:

Вам нужен цикл, который проверяет, существует ли nextWagon , он же currentWagon.nextWagon != null . Если нет, верните currentWagon . Если есть, назначьте nextWagon как currentWagon и снова запустите проверку.

вот некоторый псевдокод

 var currentEntry = startEntry;
while(currentEntry.nextEntry != null){
  currentEntry = currentEntry.nextEntry;
}
return currentEntry;