2013-06-25 2 views
0

이것은 약간의 문제를 일으 킵니다. 무슨 일이 일어나는지 잘 모르겠습니다. 이것은 데이터 구조 할당이고 강사 UML 다이어그램에 지정된대로 모든 클래스를 만들었습니다. 이것은 연결된 목록의 이상한 구현처럼 보입니다. 필자는 다른 생성자를 호출하는 ListNode 클래스의 생성자를 이해하지 못하고 왜 카운터가 목록의 항목을 추적하도록 지정되지 않았는지 이해하지 못합니다. 강사가 "두 번째 생성자가 수퍼 클래스 생성자를 호출하고 다음 문자열을 인수로 보냅니다."(name + "empty"); "라는 예외 클래스를 이해할 수 없습니다. 방금 그걸 남겼어요. 나는 이것이 어떻게 작동하는지 잘 모른다. 나는 또한 generics가 어떻게 작동하는지 전혀 모른다. 나는 약간의 독서를했다. 그러나 그것은 didnt한다 t는 많이 깨끗하게한다. 내 코드를 게시하고 도움을 주시면 감사하겠습니다. 나는 일을 쉬면서이 일을했다. 특히 어려운 것처럼 보이지 않기 때문에 나는 절대 바보처럼 느낀다.일반적인 유형의 문제로 연결된 목록

ListNode 클래스 : 여기

package linkedLists; 

public class ListNode<T> { 

T data; 
ListNode<T> nextNode; 

ListNode(T object) 
{ 
    this(object, null); 
} 

ListNode(T object, ListNode<T> node) 
{ 
    data = object; 
    nextNode = node; 
} 

T getData() 
{ 
    return data; 
} 

ListNode<T> getNext() 
{ 
    return nextNode; 
} 
} 

는 List 클래스입니다.

package linkedLists; 

    public class List<T>{ 

     ListNode<T> firstNode; 
ListNode<T> lastNode; 
String name; 

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

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

public void insertAtFront(T insertItem) 
{ 
    if(isEmpty()) 
    { 
     ListNode<T> node = new ListNode<T>(insertItem); 
     firstNode = node; 
     lastNode = node; 
    } 

    else 
    { 
     ListNode<T> tempNode = firstNode; 
     ListNode node = new ListNode(insertItem, tempNode); 
     firstNode = node; 
    } 
} 

public void insertAtBack(T insertItem) 
{ 
    if(isEmpty()) 
    { 
     ListNode<T> node = new ListNode<T>(insertItem); 
     firstNode = node; 
     lastNode = node; 
    } 

    else 
    { 
     ListNode<T> tempNode = lastNode; 
     ListNode node = new ListNode(insertItem, tempNode); 
     lastNode = node; 
    } 
} 

public T removeFromFront() throws EmptyListException 
{ 
    if(isEmpty()) 
    { 
     throw new EmptyListException("gfy"); 
    } 

    else 
    { 
     ListNode<T> nr; 
     nr = firstNode; 

     if(firstNode == lastNode) 
     { 
      firstNode = null; 
      lastNode = null; 
     } 

     else 
     { 
      firstNode = firstNode.getNext(); 
     } 

     return nr.getData(); 
    } 
} 

public T removeFromBack() throws EmptyListException 
{ 
    if(isEmpty()) 
    { 
     throw new EmptyListException("gfy"); 
    } 

    else 
    { 
     ListNode<T> nr; 
     nr = lastNode; 

     if(firstNode == lastNode) 
     { 
      firstNode = null; 
      lastNode = null; 
     } 

     else 
     { 
      ListNode<T> current = firstNode; 
      ListNode<T> secondToLast = null; 
      int numOfNodes = 0; 

      while(current != lastNode) 
      { 
       secondToLast = current; 
       current = current.getNext(); 
      } 

      lastNode = secondToLast; 
      lastNode.nextNode = null; 
     } 

     return nr.getData(); 
    } 

} 

    public boolean isEmpty() 
    { 
    if(firstNode == null) 
    return true; 

    else 
     return false; 
} 

public void print() 
{ 
    if(isEmpty()) 
    { 
     System.out.println("List is empty!"); 
     return; 
    } 

    else 
    { 
     System.out.println(firstNode.getData()); 
     ListNode<T> printNode = firstNode; 

     while(printNode != lastNode) 
     { 
      printNode = printNode.getNext(); 
      System.out.println(printNode.getData());     
     } 
    } 

} 



    } 

예외 클래스

package linkedLists; 

     public class EmptyListException extends RuntimeException 
    { 
    public EmptyListException() 
    { 
     this("list"); 
    } 

    public EmptyListException(String name) 
    { 
    } 
     } 

마지막으로 주요 방법 및 테스트 클래스 :

// ListTest.java 
// ListTest class to demonstrate List capabilities. 
import quiz1cs304summer2013kensotak.List; 
import quiz1cs304summer2013kensotak.EmptyListException; 

public class ListTest 
{ 
    public static void main(String[] args) 
    { 
     List<Integer> list = new List<Integer>(); // create a List 

     // insert integers in list 
     list.insertAtFront(-1); 
     list.print(); 
     list.insertAtFront(0); 
     list.print(); 
     list.insertAtBack(1); 
     list.print(); 
     list.insertAtBack(5); 
     list.print(); 

     // remove objects from list; print after each removal 
     try 
     { 
     int removedItem = list.removeFromFront(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 

     removedItem = list.removeFromFront(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 

     removedItem = list.removeFromBack(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 

     removedItem = list.removeFromBack(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 
     } // end try 
     catch (EmptyListException emptyListException) 
     { 
     emptyListException.printStackTrace(); 
     } // end catch 
    } // end main 
    } // end class ListTest 

다음은 출력 있어야한다 다음

The list is: -1 
The list is: 0 -1 
The list is: 0 -1 1 
The list is: 0 -1 1 5 

0 removed 
The list is: -1 1 5 

-1 removed 
The list is: 1 5 

5 removed 
The list is: 1 

1 removed 
Empty list 

내 출력은 다음과 같습니다

-1 
0 
-1 
0 
-1 
Exception in thread "main" java.lang.NullPointerException 
    at linkedLists.List.print(List.java:146) 
    at ListTest.main(ListTest.java:18) 
+0

다른 생성자를 호출하는 한 생성자는 _constructor chaining_이라고하며 [이 질문에 설명되어 있습니다 (http://stackoverflow.com/q/285177/1281433). –

+2

많은 질문과 많은 코드가 있습니다. 제 제안은 몇 가지 연구를 한 후에 정리 된 몇 가지 질문을하는 것입니다 (당신은 Generics를 이해하지 못한다고 했으니 까 시작하는 것이 좋습니다.) – Daniel

답변

0

먼저 인쇄 방법이 선행 텍스트 ("목록 :")를 인쇄하려고 시도하지 않으며 각 항목을 자체 줄에 인쇄합니다.

insertAtBack에 문제가있는 것처럼 보입니다. 새 ListNode를 만드는 인수는 거꾸로됩니다 (새 노드는 마지막 노드, 임시 노드 이후에 있어야합니다).

+0

Scott이 말하는 것을 봅니다. 나는 그것을 고쳤고 지금은 제대로 작동한다. 고마워요! 내 바보 같은 일은 아주 어리 석다. – supertommy