/* 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) + " ");
}
}
}