2013-05-11 43 views
0

即時解決一些實踐的東西,爲我的測試。我的課本中的問題要求我反向打印圓形鏈表中的內容。所以我的想法是創建一個堆棧,將這些東西移動到堆棧然後彈出。從圓形鏈表創建一個堆棧,以便反向打印列表

這裏是我做了什麼:

public void reversePrint() { 
    Stack stack = new Stack(); 

    Node<E> temp = list; 
    do { 
    stack.push(temp); 
    temp = temp.getNext(); 
    } while (temp != list); 

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

circularlist.java

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; 
    } 

}

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; 
    } 
} 

我的問題是我不能使用做。我需要一個不同的解決方案。任何幫助?

+3

*爲什麼*你不能使用'do'? – 2013-05-11 08:36:13

+1

不知何故,你需要迭代你的列表中的節點......你有什麼要求/需要使用,然後如果不是'做'?順便說一句...你有'節點'getPrevious()'方法? – A4L 2013-05-11 08:38:36

+0

@ A4L不,它是一個單一的循環鏈表,但是我有一個只用next和hasNext方法設計的迭代器。 – user2272227 2013-05-11 09:05:01

回答

1

我假設你有自己寫的LinkedList(使用Node<T>類)。

如果列表雙向鏈表:

開始從最後一個元素列表中(如果你不存儲到尾的引用遍歷的節點到達最後一個,直到),並遍歷使用getPrevious()列表(不管getNext()的名字相反)。

如果該列表是單鏈表:

而不是使用堆棧的,你可以遞歸遍歷列表,打印時展開的元素。

public static void <T> reverse(Node<T> current, Node<T> stopAt) { 
    Node<T> next = current.getNext(); 
    if (next != stopAt) { 
     reverse(next); 
    } 
    System.out.println(next.getValue(), stopAt); 
} 

這很簡單,但並非真正有效。如果列表中包含太多元素,則可能會遇到遞歸深度過深的問題。

*編輯:固定的終止條件

+0

這個方法,我不能使用參數。我只是調用printReverse(),它會反向打印列表中的所有內容。圓形鏈表fyi – user2272227 2013-05-11 09:07:17

+0

編輯了主帖。我的整個代碼現在已發佈。 – user2272227 2013-05-11 09:09:02

+0

您可以將此遞歸版本用作'CircularList'類中的私有方法。在你的printReverse()方法內部,你調用它並傳遞列表的當前頭部作爲參數。但是由於您不允許使用do {},而我懷疑您不會被允許使用遞歸。堅持@Jon Skeet的建議(: – Pyranja 2013-05-11 10:44:03

1

如果你在「允許」使用while循環,你可以轉換你的do環路成,使用break出去:

while (true) { 
    stack.push(temp); 
    temp = temp.getNext(); 
    // If we're back to the beginning, we're done 
    if (temp == list) { 
     break; 
    } 
} 

或者如果你可以使用size,它更容易:

Node<E> temp = list; 
for (int i = 0; i < size; i++) { 
    stack.push(temp); 
    temp = temp.getNext(); 
} 
+0

jon,是的!但是我們沒有休息,還有其他方式沒有休息嗎? – user2272227 2013-05-11 09:10:25

+1

@ user2272227:我現在給你一個'for'循環,但也許你是不允許使用那個......你讓我們猜測你允許使用什麼,這使得這是一個毫無意義的問題IMO。 – 2013-05-11 09:12:00

+0

我可以使用for循環。 – user2272227 2013-05-11 09:13:42