2012-08-24 121 views
0

我正在嘗試過去一年的問題,並且遇到以下問題。 問題1使用遞歸打印單向鏈表的反向方法

在下面的可能假設的ListIterator接口和LinkedList類與以下方法

public interface ListIterator<E> 
{ 
    E next(); 
    boolean hasNext(); 

} 

public class LinkedList<E> 
{ 

    public void addLast(E obj){..} 
    public int size(){..} 
    public ListIterator<E> listIterator(){...} 

} 

成品以下,使用在的ListIterator上面所列的方法中給出的printBackward方法的設計的存在接口和LinkedList類。你不應該引入任何新的變量tinto方法。在你的回答中,不要複製整個方法。寫入初始化1,初始化2,塊1,塊2,塊3的內容。 printBackward方法應該在單個列表中遞歸地寫入遞歸。參數n指定列表的大小。

public class MyLinkedList<E> extends LinkedList<E> 
{ 

      public void printBackward(int n) 
      { 

      if(n > 0){ 

       ListIterator<E> itr = /**Initialisation 1**/ list1.listIterator(); 

       int count = /**Initialisation 2**/ 0; 

       E item; 

       while(itr.hasNext()) 
       { 
       /**Block 1**/ addLast(list1); printBackward(); count --; 

       } 

       /**Block 2**/ E.next; 
      }else 

      /**Block 3**/ return; 
      } 
     } 
} 

我已經插入我的答案旁/ ** .. ** /但我不確定他們是否是正確的。如果有人能幫助我糾正我的錯誤,將不勝感激

+0

如果你只印刷,那麼你不需要向鏈表添加任何東西。 – Makoto

+0

那麼,你不能改變printBackward方法?爲什麼ListIterator itr重新初始化? – davidmontoyago

+0

@davidmontoyago,我被授予了代碼,只允許用/**...**/改變這一點。我不知道爲什麼它被重新初始化......有一點幫助? – coralbeans

回答

0

printBackward方法設計很怪異,看來他們希望你使用迭代器不管什麼去每一個遞歸的最後一個位置,它必須是性能/成效這裏不是一個問題,或者他們想看看你是多麼的詼諧。下面爲一個解決方案:

public void printBackward(int n) { 

    if (n > 0) { 
     ListIterator<E> itr = listIterator(); /** Initialisation 1 **/   
     int count = 0; /** Initialisation 2 **/ 

     E item; 
     while (itr.hasNext()) { 
      /** Block 1 **/    
      item = itr.next(); 
      if (++count == n) { 
       System.out.println(item); //prints here 
       printBackward(n-1); 
      }    
     } 
     /** Block 2 **/ 
     // nothing 
    } else {    
     /** Block 3 **/ 
     // nothing 
    } 
} 

可以使用java.util.LinkedListjava.util.ListIterator這樣的測試:

public static void main(String[] args) { 
    MyLinkedList<String> list = new MyLinkedList<String>(); 
    list.add("1"); 
    list.add("2"); 
    list.add("3"); 
    list.printBackward(list.size()); 
} 
+0

謝謝!有沒有另一種方法不使用++計數?只有在測試時打印答案而不是將其構建到/ ** Block 1 **中? – coralbeans

+0

你想避免使用count嗎?但是它不是包含在方法設計中的變量嗎? – davidmontoyago

+0

我想用count,我想知道是否有另一種方式來實現它,真相被告知,我不明白++計數和count ++之間的區別,你能爲我簡要介紹一下嗎?再次感謝!你一直很有幫助。 :) – coralbeans

0

獲取列表的長度並創建一個for循環,以便通過它們後退例如

for(int i = *sizeOfList*; i > 0; i--) 
{ 

System.out.println(currentItem[i]); 

} 
+0

這不會使用linkedList嗎?我知道如何使用for循環來實現它,但需要使用遞歸單鏈表來解決這個問題。 – coralbeans

0
public void printBackward(int n) { 

if (n > 0) { 
    ListIterator<E> itr = listIterator(); /** Initialisation 1 **/   
    int count = 0; /** Initialisation 2 **/ 

    E item; 
    while (itr.hasNext()) { 
     /** Block 1 **/    
     item = itr.next(); 
     if (count == n-1) { 
      System.out.println(item); //prints here 
      count++; 
     }    
    } 
    /** Block 2 **/ 
    printBackward(n-1); 
} else {    
    /** Block 3 **/ 
    // nothing 
} 

}