集册 Java实例教程 具有自定义列表节点的自定义列表类

具有自定义列表节点的自定义列表类

欢马劈雪     最近更新时间:2020-01-02 10:19:05

505
具有自定义列表节点的自定义列表类
/*
时代Java - nowjava.com 提供
*/

class EmptyListException extends RuntimeException 

{

   // constructor

   public EmptyListException()

   {

      this("List"); // call other EmptyListException constructor

   } 


   // constructor

   public EmptyListException(String name)

   {

      super(name + " is empty"); // call superclass constructor

   } 

}



// 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// 来 自 时代Java公众号 - N o w J a  v a . c o m

   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; 

   } 

} 


// class List definition

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

   } 


   // 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();

   } 

}


public class Main 

{

   public static void main(String[] args)

   {

      List<Integer> list = 
展开阅读全文