SLList AList
/* Represent a list of stuff, where all the "list" work is delegated * to a naked recursive data structure. */ public class SLList<Blorp> implements List61B<Blorp> { public class Node { public Blorp item; /* Equivalent of first */ public Node next; /* Equivalent of rest */ public Node(Blorp i, Node h) { item = i; next = h; } } private Node sentinel; private int size; /** Creates an empty list. */ public SLList() { size = 0; sentinel = new Node(null, null); } public SLList(Blorp x) { size = 1; sentinel = new Node(null, null); sentinel.next = new Node(x, null); } /** Adds an item of the front. */ public void addFirst(Blorp x) { Node oldFrontNode = sentinel.next; Node newNode = new Node(x, oldFrontNode); sentinel.next = newNode; size += 1; } /** Gets the front item of the list. */ public Blorp getFirst() { return sentinel.next.item; } /** Puts an item at the back of the list. */ public void addLast(Blorp x) { size += 1; Node p = sentinel; /* Move p until it reaches the end. */ while (p.next != null) { p = p.next; } p.next = new Node(x, null); } /** Returns the back node of our list. */ private Node getLastNode() { Node p = sentinel; /* Move p until it reaches the end. */ while (p.next != null) { p = p.next; } return p; } /** Returns last item */ public Blorp getLast() { Node back = getLastNode(); return back.item; } /** Deletes and returns last item. */ public Blorp removeLast() { Node back = getLastNode(); if (back == sentinel) { return null; } size = size - 1; Node p = sentinel; while (p.next != back) { p = p.next; } p.next = null; return back.item; } public int size() { return size; } /** Gets the positionth item of the list. */ public Blorp get(int position) { if (position == 0) { return getFirst(); } Node currentNode = sentinel.next.next; while (position > 1 && currentNode.next != null) { position -= 1; currentNode = currentNode.next; } return currentNode.item; } /** Inserts item into given position. * Code from discussion #3 */ public void insert(Blorp item, int position) { if (sentinel.next == null || position == 0) { addFirst(item); return; } Node currentNode = sentinel.next.next; while (position > 1 && currentNode.next != null) { position -= 1; currentNode = currentNode.next; } Node newNode = new Node(item, currentNode.next); currentNode.next = newNode; } /** TODO: Add a print method that overrides List61B's inefficient print method. */ }
/** Array based list. * @author Josh Hug */ // 0 1 2 3 4 5 6 7 // items: [6 9 -1 2 0 0 0 0 ...] // size: 5 /* Invariants: addLast: The next item we want to add, will go into position size getLast: The item we want to return is in position size - 1 size: The number of items in the list should be size. */ public class AList<Item> implements List61B<Item> { private Item[] items; private int size; /** Creates an empty list. */ public AList() { items = (Item[]) new Object[100]; size = 0; } /** Inserts item into given position. * Code from discussion #3 */ @Override public void insert(Item x, int position) { Item[] newItems = (Item[]) new Object[items.length + 1]; System.arraycopy(items, 0, newItems, 0, position); newItems[position] = x; System.arraycopy(items, position, newItems, position + 1, items.length - position); items = newItems; } /** Resizes the underlying array to the target capacity. */ private void resize(int capacity) { Item[] a = (Item[]) new Object[capacity]; System.arraycopy(items, 0, a, 0, size); items = a; } /** Inserts an item at the front. */ @Override public void addFirst(Item x) { insert(x, 0); } /** Inserts X into the back of the list. */ @Override public void addLast(Item x) { if (size == items.length) { resize(size + 1); } items[size] = x; size = size + 1; } /** Gets an item from the front. */ @Override public Item getFirst() { return get(0); } /** Returns the item from the back of the list. */ public Item getLast() { return items[size - 1]; } /** Gets the ith item in the list (0 is the front). */ public Item get(int i) { return items[i]; } /** Returns the number of items in the list. */ public int size() { return size; } /** Deletes item from back of the list and * returns deleted item. */ public Item removeLast() { Item x = getLast(); items[size - 1] = null; size = size - 1; return x; } }
public interface List61B<Item> { /** * Inserts X into the back of the list. */ public void addLast(Item x); /** * Returns the item from the back of the list. */ public Item getLast(); /** * Gets the ith item in the list (0 is the front). */ public Item get(int i); /** * Returns the number of items in the list. */ public int size(); /** * Deletes item from back of the list and * returns deleted item. */ public Item removeLast(); /** * Inserts item into given position. * Code from discussion #3 */ public void insert(Item x, int position); /** * Inserts an item at the front. */ public void addFirst(Item x); /** * Gets an item from the front. */ public Item getFirst(); /** Prints the list. Works for ANY kind of list. */ default public void print() { for (int i = 0; i < size(); i = i + 1) { System.out.print(get(i) + " "); } } }