2013-05-10 5 views
2

나는 내 교과서에서 무작위로 질문을하고 있는데이 질문을 검토하고 끝내지 못했습니다.역순으로 순환 연결된 목록 인쇄

어떻게 순환적인 단일 링크 목록을 역순으로 인쇄 할 수 있습니까? 예 : 목록에 요소가있는 경우 : 1 2 3, 인쇄해야 함 3 2 1

참고 : 순환 연결된 목록이므로 메서드에 매개 변수가 없어야합니다.

감사합니다.

+6

재귀를 시도 했습니까? – FDinoff

+0

우리가 작업 할 수있는 코드가 있습니까? – Tdorno

+0

@Tdorno void printReverse (노드 임시 = 목록; if (temp.getNext() == null) { System.out.println (temp.getInfo()); } printReverse (temp.getNext()); } } – user2272227

답변

3

기본 경우 (시작 노드가 다음 노드와 같음)에서 현재 노드를 인쇄하십시오. 그렇지 않으면 다음 노드에서 재귀를 수행 한 다음 현재 노드를 인쇄하십시오.

참고 이것은 스택 때문에 선형 공간을 사용합니다. 그러나 이것은 백 포인터가 없기 때문에 최적입니다. 편집 후

class Node { 
    int data; 
    Node next; 
    public Node getNode() ... 
    public String toString() ... 
} 

public class CircularList { 

    private Node list; 

    public void printReverse() { 
     final Node head = this.list; 
     printReverseRecurse(list, head); 
     System.out.println(list.toString()); 
    } 

    private void printReverseRecurse(Node node, Node head) { 
     if (node != head) { 
      printReverseRecurse(node.getNext(), head); 
      System.out.print(node.toString()); 
     } 
    } 
} 

, 나는 개인 방법에 head 참조를 전달하는 것을 잊었다 :에 대해 어떻게

+0

원형 단일 링크 목록에서 작동합니까? – user2272227

+1

기본 케이스를 다음 노드로 변경하십시오! = head –

+0

아, 원형이 아니 었습니다. @RonDahlgren에 따라 편집 됨. –

1

.

+1

노력을 위해 thnx를 사용하지만 메서드에서 매개 변수없이 해결해야하는 질문은/ – user2272227

+0

예. 문제. 내가 편집 할게. – Marvo

+0

최종 노드 head = 노드; 여기 노드의 의미는 무엇입니까? 그 목록의 시작을 의미합니까? – user2272227

1

다음은 프로그램 스택 대신 힙에서 스택을 사용하는 비 재귀 적 접근 방식입니다. 재귀 적 접근보다 적은 메모리를 사용해야합니다.

class Node { 
    private int data; 
    private Node next; 
    public Node getNode() { ... } 
    public String toString() { ... } 
} 

public class CircularList { 

    private Node list; 

    public reversePrint() { 
     Stack<Node> stack = new Stack<Node>(); 

     // First, put all the entries in the stack 
     Node node = list; 
     do { 
      stack.push(node); 
      node = node.getNext(); 
     } while (node != list); 

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

} 
+0

휴식을 취할 수있는 다른 방법이 있습니까? 우리는 그것을 사용하지 않습니다. – user2272227

+0

또한 각 메소드에 대해 오류를 발생 시키므로 배열이나 반복 가능으로 만 사용할 수 있다고합니다. – user2272227

+0

죄송합니다. 편집 됨. – Marvo

2

여기 재귀를 사용하여 가능한 솔루션입니다, 인쇄 방법은 매개 변수를받지 않습니다

public class ReversePrinter { 

    private Node<?> head; 
    private Node<?> current; 
    private boolean first = true; 

    public ReversePrinter(Node<?> head) { 
     this.head = head; 
     this.current = head; 
    } 

    public void printReverse() { 

     if (current == null) { 
      return; 
     } else if (current == head) { 
      if (!first) return; 
      first = false; 
     } 

     Node<?> previous = current; 
     current = current.getNext(); 
     printReverse(); 
     System.out.println(previous.getInfo()); 

    } 

} 

이처럼 사용 : 문제의 예를 들어

ReversePrinter printer = new ReversePrinter(nodeHeadOfList); 
printer.printReverse(); 

, 콘솔에 인쇄됩니다 :

3 
2 
1 
+0

조건을 계속 확인하면 실행시 예외가 발생합니다. – user2272227

+0

코드를 게시하고 전체 스택 추적을 테스트하는 데 사용한 목록으로 게시하십시오. –

+0

그런데 : 내 대답의 코드는 테스트를 거쳤으며 올바르게 작동합니다. 예외가있는 경우 사용하는 목록이 제대로 구성되지 않았기 때문일 수 있습니다. 그것을 검사하여 시작하십시오. –