diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2013-03-06 00:20:37 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2013-11-15 17:38:43 +0100 |
commit | 73d2d52f4a106ca5467576178c642f351be724b3 (patch) | |
tree | 9a123af6013e2ff3a971bd0f69b057f1fa62b3ff | |
parent | fe5a49b44178c42348e7cd1ebc20adcdbf66a720 (diff) | |
download | coursera-73d2d52f4a106ca5467576178c642f351be724b3.zip coursera-73d2d52f4a106ca5467576178c642f351be724b3.tar.gz |
Algorithms-I : 2-Randomized_Queues_Deques: add Deque.java
-rw-r--r-- | Algorithms/Part-I/2-Randomized_Queues_Deques/Deque.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/Algorithms/Part-I/2-Randomized_Queues_Deques/Deque.java b/Algorithms/Part-I/2-Randomized_Queues_Deques/Deque.java new file mode 100644 index 0000000..e8a17de --- /dev/null +++ b/Algorithms/Part-I/2-Randomized_Queues_Deques/Deque.java @@ -0,0 +1,118 @@ +/* vim: set expandtab tabstop=4 shiftwidth=4 : */ + +import java.util.Iterator; + +public class Deque<Item> implements Iterable<Item> +{ + private Node head; + private Node tail; + private int n; + + private class Node + { + Item item; + Node next; + Node prev; + } + + // construct an empty deque + public Deque() + { + head = null; + tail = null; + n = 0; + } + + // is the deque empty? + public boolean isEmpty() + { + return (head == null); + } + + // return the number of items on the deque + public int size() + { + return n; + } + + // insert the item at the front + public void addFirst(Item item) + { + if (item == null) throw new java.lang.NullPointerException(); + Node node = new Node(); + node.item = item; + node.next = head; + node.prev = null; + head = node; + if (tail == null) tail = head; + n++; + } + + // insert the item at the end + public void addLast(Item item) + { + if (item == null) throw new java.lang.NullPointerException(); + Node node = new Node(); + node.item = item; + node.next = null; + node.prev = tail; + if (tail == null) + { + head = tail = node; + } + else + { + tail.next = node; + tail = tail.next; + } + n++; + } + + // delete and return the item at the front + public Item removeFirst() + { + if (head == null) throw new java.util.NoSuchElementException(); + Item item = head.item; + if (tail == head) tail = tail.next; + head = head.next; + head.prev = null; + n--; + return item; + } + + // delete and return the item at the end + public Item removeLast() + { + if (tail == null) throw new java.util.NoSuchElementException(); + Item item = tail.item; + if (head == tail) + { + head = tail = null; + } + else + { + tail = tail.prev; + tail.next = null; + } + n--; + return item; + } + + // return an iterator over items in order from front to end + public Iterator<Item> iterator() { return new DequeIterator(); } + + private class DequeIterator implements Iterator<Item> + { + private Node current = head; + + public boolean hasNext() { return current != null; } + public void remove() { throw new java.lang.UnsupportedOperationException(); } + public Item next() + { + if (current == null) throw new java.util.NoSuchElementException(); + Item item = current.item; + current = current.next; + return item; + } + } +} |