0

これは私に問題を引き起こしています...何が起こっているのかよくわかりません。これはデータ構造の課題であり、インストラクターの UML 図に従って指定されたすべてのクラスを作成しました。これは、リンクされたリストの奇妙な実装のようです。別のコンストラクターを呼び出す ListNode クラスのコンストラクターがよくわかりません。また、リスト内の項目を追跡するためにカウンターが指定されなかった理由もわかりません。また、講師が「2 番目のコンストラクターがスーパークラス コンストラクターを呼び出し、その引数として次の文字列を送信します: ( name + “ is empty” );」と指定しているため、私が作成した例外クラスも理解できません。私はそれを空のままにしました。これがどのように機能するかはよくわかりません。また、ジェネリックがどのように機能するかについてもまったくわかりません。私はいくつかの読書をしましたが、それはあまり明確ではありませんでした. 私' 私のコードを投稿して、助けていただければ幸いです。私はこれに取り組むために仕事を休みましたが、これは特に難しくないように見えるので、絶対的な馬鹿のように感じます.

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; 
}
}

ここにリストクラスがあります。

  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)
4

1 に答える 1

0

まず、あなたの print メソッドは先頭のテキスト ("The list is:") を印刷しようとさえせず、各項目をそれぞれの行に印刷します。

それを考えると、問題はinsertAtBackにあるようです。新しいListNodeを作成するための引数は逆です(新しいノードは、最後のノードである一時ノードの後に​​来る必要があります)。

于 2013-06-25T19:08:32.380 に答える