Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Exercise 1 Modify the List<T> class of Figure 21.3 to include a method that recu

ID: 3575630 • Letter: E

Question

Exercise 1

Modify the List<T> class of Figure 21.3 to include a method that recursively searches a linked-list for a specified value. Ensure that the name of your method includes your last name(Kuria). The method must return a reference to the value if it is found; otherwise, it must return null. Use your method in a test program that creates a list of integers. The program must prompt the user for a value to locate in the list.

Here is attached Figure 21.3.

// Fig. 21.3: List.java
// ListNode and List class declarations.
package com.deitel.datastructures;

// class to represent one node in a list
class ListNode<T>
{
// package access members; List can access these directly
T data; // data for this node
ListNode<T> nextNode; // reference to the next node in the list

// constructor creates a ListNode that refers to object
ListNode(T object)
{
this(object, null);
}

// constructor creates ListNode that refers to the specified
// object and to the next ListNode
ListNode(T object, ListNode<T> node)
{
data = object;
nextNode = node;
}

// return reference to data in node
T getData()
{
return data;
}

// return reference to next node in list
ListNode<T> getNext()
{
return nextNode;
}
} // end class ListNode<T>

// class List definition
public class List<T>
{
private ListNode<T> firstNode;
private ListNode<T> lastNode;
private String name; // string like "list" used in printing

// constructor creates empty List with "list" as the name
public List()
{
this("list");
}

// constructor creates an empty List with a name
public List(String listName)
{
name = listName;
firstNode = lastNode = null;
}

// insert item at front of List
public void insertAtFront(T insertItem)
{
if (isEmpty()) // firstNode and lastNode refer to same object
firstNode = lastNode = new ListNode<T>(insertItem);
else // firstNode refers to new node
firstNode = new ListNode<T>(insertItem, firstNode);
}

// insert item at end of List
public void insertAtBack(T insertItem)
{
if (isEmpty()) // firstNode and lastNode refer to same object
firstNode = lastNode = new ListNode<T>(insertItem);
else // lastNode's nextNode refers to new node
lastNode = lastNode.nextNode = new ListNode<T>(insertItem);
}

// remove first node from List
public T removeFromFront() throws EmptyListException
{
if (isEmpty()) // throw exception if List is empty
throw new EmptyListException(name);

T removedItem = firstNode.data; // retrieve data being removed

// update references firstNode and lastNode
if (firstNode == lastNode)
firstNode = lastNode = null;
else
firstNode = firstNode.nextNode;

return removedItem; // return removed node data
} // end method removeFromFront

// remove last node from List
public T removeFromBack() throws EmptyListException
{
if (isEmpty()) // throw exception if List is empty
throw new EmptyListException(name);

T removedItem = lastNode.data; // retrieve data being removed

// update references firstNode and lastNode
if (firstNode == lastNode)
firstNode = lastNode = null;
else // locate new last node
{
ListNode<T> current = firstNode;

// loop while current node does not refer to lastNode
while (current.nextNode != lastNode)
current = current.nextNode;

lastNode = current; // current is new lastNode
current.nextNode = null;
}

return removedItem; // return removed node data
}

// determine whether list is empty
public boolean isEmpty()
{
return firstNode == null; // return true if list is empty
}

// output list contents
public void print()
{
if (isEmpty())
{
System.out.printf("Empty %s%n", name);
return;
}

System.out.printf("The %s is: ", name);
ListNode<T> current = firstNode;

// while not at end of list, output current node's data
while (current != null)
{
System.out.printf("%s ", current.data);
current = current.nextNode;
}

System.out.println();
}
} // end class List<T>

Explanation / Answer

class ListNode

{

   Object data;   

   ListNode nextNode;

   ListNode( Object object )

   {

      this( object, null );

   }

   ListNode( Object object, ListNode node )

   {

      data = object;   

      nextNode = node;

   }

      Object getObject()

   {

      return data;  

   }    

   ListNode getNext()

   {

      return nextNode;

   }

}

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 ", 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( " " );

   }

}