2013-05-11 2 views
1

Я решаю некоторые упражнения для практики, и я не мог решить проблему правильно. Вопрос просит меня распечатать список обратно, и он не должен принимать никаких параметров, вызывается только printReverse() и поэтому печатает список в обратном порядке. Я подумала, как стек, вот оно:Печать в обратном круговом одиночном связанном списке

public class CircularList<E> implements List<E> { 

    Node<E> list; 
    int size; 

    public CircularList() { 
    list = new Node(null); 
    list.setNext(list); 
    size = 0; 
    } 

    @Override 
    public void add(E element) { 
    Node<E> newNode = new Node(element); 
    newNode.setNext(list.getNext()); 
    list.setNext(newNode); 
    size++; 
    } 

    @Override 
    public boolean remove(E element) { 
    Node<E> location = find(element); 
    if (location != null) { 
     location.setNext(location.getNext().getNext()); 
     size--; 
    } 
    return location != null; 
    } 

    @Override 
    public E get(E element) { 
    Node<E> location = find(element); 
    if (location != null) { 
     return (E) location.getNext().getInfo(); 
    } 
    return null; 
    } 

    @Override 
    public boolean contains(E element) { 
    return find(element) != null; 
    } 

    @Override 
    public int size() { 
    return size; 
    } 

    @Override 
    public Iterator<E> iterator() { 
    return new Iterator<E>() { 
     Node<E> tmp = list.getNext(); 

     @Override 
     public boolean hasNext() { 
     return tmp != list; 
     } 

     @Override 
     public E next() { 
     E info = tmp.getInfo(); 
     tmp = tmp.getNext(); 
     return info; 
     } 

     @Override 
     public void remove() { 
     throw new UnsupportedOperationException("Not supported yet."); 
     } 
    }; 
    } 

    protected Node<E> find(E element) { 
    Node<E> tmp = list; 
    while (tmp.getNext() != list && !tmp.getNext().getInfo().equals(element)) { 
     tmp = tmp.getNext(); 
    } 

    if (tmp.getNext() == list) { 
     return null; 
    } else { 
     return tmp; 
    } 
    } 

    public void reversePrinter() { 

    Stack stack = new Stack(); 
    Node<E> temp = list; 

    for (int i = 0; i < size; i++) { 
     stack.push(temp.getInfo()); 
     temp = temp.getNext(); 
     } 

    while (! stack.empty()) { 
     System.out.print(stack.pop()); 
    } 
    } 
} 

Node.java

public class Node<E> { 

    E info; 
    Node<E> next; 

    public Node(E element) { 
    info = element; 
    next = null; 
    } 

    public void setInfo(E element) { 
    info = element; 
    } 

    public E getInfo() { 
    return info; 
    } 

    public void setNext(Node<E> next) { 
    this.next = next; 
    } 

    public Node<E> getNext() { 
    return next; 
    } 
} 

Main.java

public class Main { 

    public static void main(String[] args) { 
    CircularList<String> x = new CircularList<String>(); 

    x.add("hi"); 
    x.add("hhhh"); 
    x.add("hi"); 
    x.add("hhhh"); 
    x.add("hi"); 
    x.reversePrinter(); 


    } 
} 

Это печатает: хххх хххх привет привет нуль

его следует распечатать: hi hhhh hi hhhh hi

Пожалуйста, помогите мне исправить. Благодаря!

ответ

2

Рекомендуется заменить цикл:

for (int i = 0; i < size; i++) { 
    stack.push(temp.getInfo()); 
    temp = temp.getNext(); 
    } 

со следующим использованием Вашего итератора:

for (Node<E> n : this) { 
    stack.push(n); 
} 

эквивалентно:

public void reversePrinter() { 
    Stack stack = new Stack();  //create a stack for reversing order 
    Iterator<E> it = this.iterator(); //get this object's iterator 
    while(it.hasNext())    //while there is still another object 
     stack.push(it.next());   //add the next object to the stack 

    while(!stack.empty())    //while the stack is not empty 
     System.out.print(stack.pop()); //print the data from the stack 
} 

Если предположить, что итератор правильно реализованный это должно работать

1

Список полей всегда указывает на посторонний узел с нулевым элементом.

Stack<E> stack = new Stack<>(); 
    Node<E> temp = list.getNext(); 
1

Проблема заключается в методе reversePrinter:

public void reversePrinter() { 

    Stack<E> stack = new Stack(); 
    Node<E> temp = list.getNext(); 

    for (int i = 0; i < size; i++) { 
     stack.push(temp.getInfo()); 
     temp = temp.getNext(); 
     } 

    while (! stack.empty()) { 
     System.out.print(stack.pop()); 
    } 
    } 

Initialize

Node<E> temp = list.getNext(); 

Вместо

Node<E> temp = list; 

Работы с использованием итераторов тоже.

+0

Использование фиктивного узла является вполне разумной реализацией –

+0

справа, тогда я отредактирую, я нашел ошибку. – bobkilla

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