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( " " );
}
}
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.