public class AbbreviatedLinkedList { private Node first; /** * Constructs an empty linked list. */ public AbbreviatedLinkedList() { first = null; } /** * Adds an element to the front of the linked list. * @param element the element to add */ public void addFirst(Object element) { Node newNode = new Node(); newNode.data = element; newNode.next = first; first = newNode; } /** * Internal method to recursively reverse the list. * @param p1 the node where to start reversing * @return the head node of the reversed list */ private Node reverse(Node p1) { if ((p1 == null) || (p1.next == null)) return p1; // base case else { Node p2 = p1.next; // one element shorter Node p3 = reverse(p2); p2.next = p1; // append first element to reversed list p1.next = null; return p3; // head of reversed list } } /** * Public driver for the recursive reverse method. */ public void reverseRecursive() { first = reverse(first); } /** * Return the linked list as a string. */ public String toString() { StringBuilder str = new StringBuilder("["); Node p = first; while (p != null) { str.append(p.data); p = p.next; if (p != null) str.append(" "); } str.append("]"); return str.toString(); } class Node { public Object data; public Node next; } public static void main(String[] args) { AbbreviatedLinkedList list = new AbbreviatedLinkedList(); list.addFirst("D"); list.addFirst("C"); list.addFirst("B"); list.addFirst("A"); System.out.println(" Original list: " + list); list.reverseRecursive(); System.out.println("Recursively reversed: " + list); } }