2017-06-29 21 views
3

こんにちは皆私はJavaを使い慣れていないので、IDは本当にこの点について助けてくれています。 これは私が遭遇した問題です: 私はリストクラスとlistNodeクラスを持っています、リストクラスは名前、firstNodeとlastNodeで表されます。 firstNodeとlastNodeはlistNode型であり、listNodeはObject(例:dataまたはObject o)で表され、listNode型のリストの次のNodeを指すnextNodeによって表されます。hasNext()メソッドを使用した再帰および逆帰ループ

Listクラス:

public class List { 

private ListNode firstNode; 
private ListNode lastNode; 
private String name; 

public List() { 
    this("list"); 
} 

public List(String listName) { 
    name = listName; 
    firstNode = lastNode = null; 
} 

public void insertAtFront(Object insertItem) { 
    if (isEmpty()) 
     firstNode = lastNode = new ListNode(insertItem); 
    else 
     firstNode = new ListNode(insertItem, firstNode); 
} 

public void insertAtBack(Object insertItem) { 
    if (isEmpty()) 
     firstNode = lastNode = new ListNode(insertItem); 
    else 
     lastNode = lastNode.nextNode = new ListNode(insertItem); 
} 

public Object removeFromFront() throws EmptyListException { 
    if (isEmpty()) 
     throw new EmptyListException(name); 
    Object removedItem = firstNode.data; 

    if (firstNode == lastNode) 
     firstNode = lastNode = null; 
    else 
     firstNode = firstNode.nextNode; 
    return removedItem; 
} 

public Object removeFromBack() throws EmptyListException { 
    if (isEmpty()) 
     throw new EmptyListException(name); 

    Object removedItem = lastNode.data; 
    if (firstNode == lastNode) 
     firstNode = lastNode = null; 
    else { 
     ListNode current = firstNode; 

     while (current.nextNode != lastNode) 
      current = current.nextNode; 

     lastNode = current; 
     current.nextNode = null; 
    } 
    return removedItem; 
} 

public boolean isEmpty() { 
    return firstNode == null; 
} 

public void print() { 
    if (isEmpty()) { 
     System.out.printf("Empty %s\n", name); 
     return; 
    } 
    System.out.printf("The %s is : ", name); 
    ListNode current = firstNode; 

    while (current != null) { 
     System.out.printf("%s", current.data); 
     current = current.nextNode; 
    } 
    System.out.println("\n"); 
} 

@Override 
public String toString() { 
    String stk = "("; 
    if(isEmpty())return "Empty List"; 
    ListNode checkNode = firstNode; 
     while (checkNode != null) { 
     stk += checkNode.data.toString()+ " , "; 
     checkNode = checkNode.nextNode; 
    } 
    return stk+")"; 
} 
public ListNode removeAt (int k){ 
    if(k<=0 || k>getLength()) 
     try{ 
      throw new IllegalValues(); 
     }catch(IllegalValues iv){ 
      iv.printStackTrace(); 
      return null; 
     } 
    ListNode newNode = firstNode; 
    if (k==1) { 
     ListNode removedNode = firstNode; 
     firstNode = firstNode.nextNode; 
     return removedNode; 
    } 
    ListNode someNode = firstNode; 
    for (int i = 1; i < k - 1; i++) { 
     someNode = someNode.nextNode; 
    } 
    ListNode removedNode = someNode.nextNode; 
    someNode.nextNode = someNode.nextNode.nextNode; 
    return removedNode; 
} 
public int getLength(){ 
    ListNode checkNode = firstNode; 
    int count =0; 
    while (checkNode != null) { 
    count++; 
    checkNode = checkNode.nextNode; 
} 
    return count; 
} 
public void show(){ 
    if (firstNode==null) 
     return; 
    else 
     System.out.print(firstNode + " ,"); 
     firstNode.show(); 
    } 
public void showRev(){ 
    if (lastNode==null) 
     return; 
    else 
     System.out.println(lastNode + ","); 
     lastNode.showRev(); 
    } 
    } 

ListNodeクラス

public class ListNode { 

Object data; 
ListNode nextNode; 

public ListNode(Object o) { 
    this(o, null); 
} 

public ListNode(Object o, ListNode node) { 
    data = o; 
    nextNode = node; 
} 

public Object getObject() { 
    return data; 
} 

public ListNode getNext(){ 
    return nextNode; 
} 

public ListNode show() { 
if(this.nextNode == null)return this; 
ListNode displayMe = nextNode.show(); 
System.out.print(displayMe + " , "); 
return displayMe; 

} 

public ListNode showRev() { 
    if(this.firstNode == null)return this; 
    ListNode displayMe = lastNode.show(); 
    System.out.print(displayMe + " , "); 
    return displayMe; 

} 

} 

私は私がしようとしている今、最初から最後まで、リスト内のすべてのオブジェクトを表示するショーと呼ばれる再帰的なメソッドを持っています同様の方法(メソッド名はshowRev())を使ってオブジェクトを末尾から始め(再帰的なメソッド)まで表示します。これは以前のメソッドを持つことが可能だとは思わないので、このメソッドにちょっと残っています。 Idは本当に任意のアイデア おかげでみんな

+0

ちょうどfyi: 'show'は[再帰的]ではありません(http://pages.cs.wisc.edu/~calvin/cs110/RECURSION.html) – nem035

+0

クラスリストの番組は再帰的ではありませんが、それは再帰的なListNodeのshowメソッドを呼び出す –

+0

いいえ、それは同じクラスから作成されたメソッドを別のインスタンスで呼び出すだけです。 'this.show'を呼び出した場合、' anotherNode.show'を呼び出すのは再帰的でした。 – nem035

答えて

2

あなたshowRevメソッドは、引数を取ることが許可されている場合は、私たちはjava.util.List内のすべてのListNodeを保存することができ感謝:ここでの再帰は特別何もしないことを

public java.util.List<ListNode> showRev(java.util.List<ListNode> nodes) { 
    if (this.nextNode == null) { 
     Collections.reverse(nodes); 

     System.out.println(nodes.stream().collect(Collectors.joining(" "))); 

     return nodes; 
    } 

    nodes.add(lastNode.show()); 

    return showRev(nodes); 
} 

注意が、 ListNodejava.util.Listに追加してください。

このメソッドを呼び出すには、new ArrayList<>()に渡します。

また、と簡単に混同する可能性があるので、私はクラス名としてListを使用することを控えます。

関連する問題