具有自定义列表节点的自定义列表类
/* 时代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 =