2012-08-24 2 views
0

나는 지난 1 년간의 질문에 대한 재시도를 시도하고 있으며 아래 질문에 집착하고 있습니다. 에서 질문 1재귀를 사용하여 단일 연결 목록에 대한 역방향 메서드 인쇄

당신이 반복자에 위의 방법을 사용하여 아래의는 printBackward 방법의 디자인을 완성 다음 방법

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

} 

public class LinkedList<E> 
{ 

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

} 

과 반복자 인터페이스와 LinkedList의 클래스의 존재를 가정 할 수 다음 인터페이스 및 LinkedList 클래스. 메소드에 새로운 변수를 추가해서는 안됩니다. 귀하의 대답에 전체 방법을 복사하지 마십시오. 초기화 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

감사! ++ 카운트를 사용하지 않는 다른 방법이 있습니까?/** 블록 1 **에 그것을 구축하는 대신 테스트 할 때만 대답을 인쇄 할 수 있습니까? – coralbeans

+0

카운트 사용을 피 하시겠습니까? 그러나 그것은 방법 설계에 포함 된 변수가 아닌가? – davidmontoyago

+0

카운트를 사용하고 싶습니다. 구현할 다른 방법이 있는지 궁금 해서요. 진실을 말하면서, ++ 카운트와 카운트 ++의 차이점을 이해하지 못합니다. 다시 한 번 감사드립니다! 너는 너무 도움이되었다. :) – 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 
} 

}

관련 문제