summaryrefslogtreecommitdiffstats
path: root/Algorithms/Part-I
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2013-03-06 00:20:37 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2013-11-15 17:38:43 +0100
commit73d2d52f4a106ca5467576178c642f351be724b3 (patch)
tree9a123af6013e2ff3a971bd0f69b057f1fa62b3ff /Algorithms/Part-I
parentfe5a49b44178c42348e7cd1ebc20adcdbf66a720 (diff)
downloadcoursera-73d2d52f4a106ca5467576178c642f351be724b3.zip
coursera-73d2d52f4a106ca5467576178c642f351be724b3.tar.gz
Algorithms-I : 2-Randomized_Queues_Deques: add Deque.java
Diffstat (limited to 'Algorithms/Part-I')
-rw-r--r--Algorithms/Part-I/2-Randomized_Queues_Deques/Deque.java118
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;
+ }
+ }
+}