Возникли проблемы с обходом двусвязного списка в обратном порядке

Я действительно изо всех сил пытаюсь исправить свой код для этого. Я создал двусвязный список, который я пытаюсь пройти в обратном порядке.

Любые идеи?

Вот мой код: Node.java:

public class Node {
String data;
Node next;


public Node(String data) {
    super();
    this.data = data;
    this.next = null;
}

public String getData() {
    return data;
}

public void setData(String data) {
    this.data = data;
}

public Node getNext() {
    if (this.next != null)
        return this.next;
    else
        return null;
}

public void setNext(Node a) {
    this.next = a;
}

@Override
public String toString() {          //CHECK
    if(data== null){
        return "null";
    }
    else
        return data  + "-->";
}

}

Вот второй класс "DNode.java":

public class DNode extends Node {

Node prev;

public DNode(String data) {
    super(data);
    this.prev = null;
}

public Node getPrev() {
    return prev;
}

public void setPrev(Node prev) {
    this.prev = prev;
}

}

Наконец, вот DoublyLinkedList.java: (переопределяет методы «добавить» и «удалить» из другого класса «Связанный список»)

открытый класс DoubleLinkedList расширяет LinkedList {

DNode head, tail,current; 

public DoublyLinkedList() {

    this.head = this.tail = this.current = null; 
}



public void add(DNode a) {   //CHECK
    if (this.head == null) {
        this.head = tail = current= a;
        this.head.prev = null;
    }
    else{
        //a.setPrev(this.current);
        this.current.next= a;
        a.setPrev(this.current);
        this.current = this.tail = a;
    }
}
@Override
public void remove(String removestring) { 
    this.current = head;
    this.current.prev = head;
    while (this.current.getData() != removestring) {

        if (this.current.next == null) {

            System.out.println("not found");
            return;
        } else {
            this.current.prev = this.current;
            this.current = (DNode) current.next;
        }
    }
    if (this.current == head) {

        head = (DNode) head.next;

    } else {
        this.current.prev.next = (DNode) this.current.next;

    }
}



public void printList() {
    DNode temp = this.head;
    while (temp != null) {
        System.out.println(temp);
        temp = (DNode) temp.getNext();
    }

}

    public void reverseList(){
            this.current = this.tail;
    this.current.setNext(this.current.getPrev());
    this.current.setPrev(null);
    this.current = (DNode) this.current.getNext();


    while(this.current.getPrev()!= null){
        if(this.current.getNext() == null){
            this.current.setNext((this.current).getPrev()); 
            this.current.setPrev(null);
            this.current = (DNode)this.current.getNext();
        }
        else{
            DNode tempprev = (DNode) this.current.getNext();
            this.current.setNext(this.current.getPrev()); 
            this.current.setPrev(tempprev);
            this.current = (DNode) this.current.getNext();
        }
        DNode temp2 = this.tail;
        this.head = this.tail;
        this.tail = temp2;
    }

}

Я могу распечатать список вперед, но возвращаясь назад, я сталкиваюсь с бесконечным циклом. Любые идеи?

Спасибо!


person user2376566    schedule 05.12.2013    source источник
comment
с какой стати у вас два класса Node??   -  person Amir Afghani    schedule 05.12.2013
comment
Это домашнее задание. Мой профессор назначил это, а позже понял, что в этом мало смысла... но мы все равно должны это сделать... это было больно   -  person user2376566    schedule 05.12.2013


Ответы (3)


Что ж, у нас уже есть способ двигаться вперед. Поскольку это двойная ссылка, мы можем просто преобразовать этот код построчно и вместо перехода к следующему (вперед) перейти к предыдущему (назад). Мы также начинаем с хвоста вместо головы.

Принимая во внимание, что это был ваш старый метод печати вперед:

public void printList() {
    DNode temp = this.head;
    while (temp != null) {
        System.out.println(temp);
        temp = (DNode) temp.getNext();
    }

}

Это может быть ваш новый метод печати в обратном направлении:

public void printBackwardsList() {
    DNode temp = this.tail;
    while(temp != null) {
        System.out.println(temp);
        temp = (DNode) temp.getPrev();
    }
}

Обратите внимание, что они почти одинаковы, за исключением того, что мы заменили хвост на голову и getNext на getPrev.

person Vineet Kosaraju    schedule 05.12.2013
comment
Это немного упростило задачу. Я только начал изучать базовые структуры данных, такие как односвязные и двусвязные списки. Я знаю, что это был очень простой вопрос. Спасибо за ответ! - person user2376566; 05.12.2013
comment
Нет проблем, рад помочь. Очень трудно думать назад, наш разум так не устроен, но вперед легко. Пожалуйста, нажмите зеленую галочку на один из этих трех ответов, чтобы сообщить другим, что это правильное решение :) - person Vineet Kosaraju; 06.12.2013
comment
@VineetKosaraju проголосуйте за дружелюбный способ ответить на очень простой вопрос. - person jhurtado; 27.02.2016

Ваша модель класса кажется слишком сложной. Для этого вам вообще не нужен класс DNode. Ваш метод печати списка в обратном порядке должен быть таким же простым, как и метод обычной печати списка.

public void printListReverse() {
    Node temp = this.tail;
    while (temp != null) {
        System.out.println(temp);
        temp = temp.getPrevious();
    }
}

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

person Amir Afghani    schedule 05.12.2013
comment
Я не думаю, что у его узла есть метод getPrevious, поэтому он использует DNode. - person Vineet Kosaraju; 05.12.2013
comment
Затем он может добавить этот метод на узел - person Amir Afghani; 05.12.2013
comment
@AmirАфгани, так как это домашняя работа, скорее всего, это не вариант - person vandale; 05.12.2013
comment
Это очень плохо - мне жаль, что ваш учитель не знает, как моделировать данные. Если бы это был я, я бы поспорил с профессором о данных классах - person Amir Afghani; 05.12.2013
comment
Спасибо! Это было просто странно из-за дополнительного ненужного класса. Это определенно гораздо более простой способ справиться с этим. - person user2376566; 05.12.2013

в то время как (this.current.getPrev ()! = ноль)

заменить

в то время как (this.current.getPrev ()! = голова)

person Nihar    schedule 05.12.2013