diff --git a/doubly_linked_list/doubly_linked_list.py b/doubly_linked_list/doubly_linked_list.py index 6f91b43a9b..5c42c640c2 100644 --- a/doubly_linked_list/doubly_linked_list.py +++ b/doubly_linked_list/doubly_linked_list.py @@ -7,7 +7,30 @@ def __init__(self, value, prev=None, next=None): self.prev = prev self.value = value self.next = next - + + def get_value(self): + return self.value + + def get_next(self): + if self.next: + return self.next + else: + return None + + def get_previous(self): + if self.prev: + return self.prev + else: + return None + + def delete(self): + if self.prev: + self.prev.next = self.next + if self.next: + self.next.prev = self.prev + self.value = None + self.next = None + self.prev = None """ Our doubly-linked list class. It holds references to the list's head and tail nodes. @@ -27,7 +50,15 @@ def __len__(self): the old head node's previous pointer accordingly. """ def add_to_head(self, value): - pass + root = ListNode(value) + if self.head and self.tail: + root.next = self.head + self.head.prev = root + self.head = root + else: + self.head = root + self.tail = root + self.length += 1 """ Removes the List's current head node, making the @@ -35,7 +66,22 @@ def add_to_head(self, value): Returns the value of the removed Node. """ def remove_from_head(self): - pass + if self.head: + headValue = self.head.get_value() + if self.length > 1: + newHead = self.head.get_next() + self.head.delete() + self.head = newHead + self.length -= 1 + return headValue + else: + self.head.delete() + self.head = None + self.tail = None + self.length -= 1 + return headValue + else: + return None """ Wraps the given value in a ListNode and inserts it @@ -43,7 +89,15 @@ def remove_from_head(self): the old tail node's next pointer accordingly. """ def add_to_tail(self, value): - pass + endNode = ListNode(value) + if self.head and self.tail: + endNode.prev = self.tail + self.tail.next = endNode + self.tail = endNode + else: + self.head = endNode + self.tail = endNode + self.length += 1 """ Removes the List's current tail node, making the @@ -51,32 +105,85 @@ def add_to_tail(self, value): Returns the value of the removed Node. """ def remove_from_tail(self): - pass + if self.tail: + tailValue = self.tail.get_value() + if self.length > 1: + newTail = self.tail.get_previous() + self.tail.delete() + self.tail = newTail + self.length -= 1 + return tailValue + else: + self.tail.delete() + self.tail = None + self.head = None + self.length -= 1 + return tailValue + else: + return None """ Removes the input node from its current spot in the List and inserts it as the new head node of the List. """ def move_to_front(self, node): - pass + value = node.value + if node == self.head: + return + elif node == self.tail: + self.remove_from_tail() + self.add_to_head(value) + else: + self.delete(node) + self.add_to_head(value) """ Removes the input node from its current spot in the List and inserts it as the new tail node of the List. """ def move_to_end(self, node): - pass + value = node.value + if node == self.tail: + return + elif node == self.head: + self.remove_from_head() + self.add_to_tail(value) + else: + self.delete(node) + self.add_to_tail(value) """ Deletes the input node from the List, preserving the order of the other elements of the List. """ def delete(self, node): - pass + if self.length == 0: + return + elif self.length == 1: + self.head = None + self.tail = None + node.delete() + self.length -= 1 + elif self.head == node: + self.remove_from_head() + elif self.tail == node: + self.remove_from_tail() + else: + node.delete() + self.length -= 1 """ Finds and returns the maximum value of all the nodes in the List. """ def get_max(self): - pass \ No newline at end of file + if not self.head: + return None + max_value = self.head.value + current_node = self.head + while current_node: + if current_node.value > max_value: + max_value = current_node.value + current_node = current_node.get_next() + + return max_value \ No newline at end of file diff --git a/queue/queue.py b/queue/queue.py index 0d2599ded7..1c1154ed4b 100644 --- a/queue/queue.py +++ b/queue/queue.py @@ -13,16 +13,46 @@ Stretch: What if you could only use instances of your Stack class to implement the Queue? What would that look like? How many Stacks would you need? Try it! """ + +""" class Queue: def __init__(self): self.size = 0 - # self.storage = ? + self.storage = [] + + def __len__(self): + return len(self.storage) + + def enqueue(self, value): + self.storage.append(value) + + def dequeue(self): + if len(self.storage) > 0: + item = self.storage[0] + del self.storage[0] + else: + item = None + return item + +""" +from singly_linked_list import LinkedList + +class Queue: + def __init__(self): + self.size = 0 + self.storage = LinkedList() def __len__(self): - pass + return self.size def enqueue(self, value): - pass + self.storage.add_to_tail(value) + self.size += 1 + def dequeue(self): - pass + if self.size == 0: + return None + self.size -= 1 + return self.storage.remove_head() + \ No newline at end of file diff --git a/queue/singly_linked_list.py b/queue/singly_linked_list.py new file mode 100644 index 0000000000..4a562a0ae4 --- /dev/null +++ b/queue/singly_linked_list.py @@ -0,0 +1,78 @@ +class Node: + def __init__(self, value = None, next_node = None): + self.value = value + self.next_node = next_node + + def get_value(self): + return self.value + + def get_next(self): + return self.next_node + + def set_next(self, new_next): + self.next_node = new_next + +class LinkedList: + def __init__(self): + self.head = None + self.tail = None + + def add_to_tail(self, value): + new_node = Node(value, None) + if not self.head: + self.head = new_node + self.tail = new_node + else: + self.tail.set_next(new_node) + self.tail = new_node + + def remove_head(self): + if not self.head: + head = self.head + self.head = None + self.tail = None + return head.get_value() + value = self.head.get_value() + self.head = self.head.get_next() + return value + + def remove_tail(self): + if not self.head: + return None + + if self.head is self.tail: + value = self.head.get_value() + self.head = None + self.tail = None + return value + + current = self.head + + while current.get_next() is not self.tail: + current = current.get_next() + + value = self.tail.get_value() + self.tail = current + return value + + def contains(self, value): + if not self.head: + return False + + current = self.head + while current: + if current.get_value() == value: + return True + current = current.get_next() + return False + + def get_max(self): + if not self.head: + return None + max_value = self.head.get_value() + current = self.head.get_next() + while current: + if current.get_value() > max_value: + max_value = current.get_value() + current = current.get_next() + return max_value \ No newline at end of file diff --git a/singly_linked_list/singly_linked_list.py b/singly_linked_list/singly_linked_list.py index e69de29bb2..d915b46a44 100644 --- a/singly_linked_list/singly_linked_list.py +++ b/singly_linked_list/singly_linked_list.py @@ -0,0 +1,80 @@ +class Node: + def __init__(self, value=None, next_node=None): + self.value = value + self.next_node = next_node + + def get_value(self): + return self.value + + def get_next(self): + return self.next_node + + def set_next(self, new_next): + self.next_node = new_next + +class LinkedList: + def __init__(self): + self.head = None + self.tail = None + + def add_to_tail(self, value): + new_node = Node(value, None) + if not self.head: + self.head = new_node + self.tail = new_node + else: + self.tail.set_next(new_node) + self.tail = new_node + + def remove_head(self): + if not self.head: + return None + if not self.head.get_next(): + head = self.head + self.head = None + self.tail = None + return head.get_value() + value = self.head.get_value() + self.head = self.head.get_next() + return value + + def remove_tail(self): + if not self.head: + return None + + if self.head is self.tail: + value = self.head.get_value() + self.head = None + self.tail = None + return value + + current = self.head + + while current.get_next() is not self.tail: + current = current.get_next() + + value = self.tail.get_value() + self.tail = current + return value + + def contains(self, value): + if not self.head: + return False + + current = self.head + while current: + if current.get_value() == value: + return True + current = current.get_next() + return False + + def get_max(self): + if not self.head: + return None + max_value = self.head.get_value() + current = self.head.get_next() + while current: + if current.get_value() > max_value: + max_value = current.get_value() + current = current.get_next() + return max_value \ No newline at end of file diff --git a/stack/singly_linked_list.py b/stack/singly_linked_list.py new file mode 100644 index 0000000000..d915b46a44 --- /dev/null +++ b/stack/singly_linked_list.py @@ -0,0 +1,80 @@ +class Node: + def __init__(self, value=None, next_node=None): + self.value = value + self.next_node = next_node + + def get_value(self): + return self.value + + def get_next(self): + return self.next_node + + def set_next(self, new_next): + self.next_node = new_next + +class LinkedList: + def __init__(self): + self.head = None + self.tail = None + + def add_to_tail(self, value): + new_node = Node(value, None) + if not self.head: + self.head = new_node + self.tail = new_node + else: + self.tail.set_next(new_node) + self.tail = new_node + + def remove_head(self): + if not self.head: + return None + if not self.head.get_next(): + head = self.head + self.head = None + self.tail = None + return head.get_value() + value = self.head.get_value() + self.head = self.head.get_next() + return value + + def remove_tail(self): + if not self.head: + return None + + if self.head is self.tail: + value = self.head.get_value() + self.head = None + self.tail = None + return value + + current = self.head + + while current.get_next() is not self.tail: + current = current.get_next() + + value = self.tail.get_value() + self.tail = current + return value + + def contains(self, value): + if not self.head: + return False + + current = self.head + while current: + if current.get_value() == value: + return True + current = current.get_next() + return False + + def get_max(self): + if not self.head: + return None + max_value = self.head.get_value() + current = self.head.get_next() + while current: + if current.get_value() > max_value: + max_value = current.get_value() + current = current.get_next() + return max_value \ No newline at end of file diff --git a/stack/stack.py b/stack/stack.py index 6e6d660ac7..cd50e8fa99 100644 --- a/stack/stack.py +++ b/stack/stack.py @@ -10,16 +10,43 @@ 3. What is the difference between using an array vs. a linked list when implementing a Stack? """ + +""" class Stack: def __init__(self): self.size = 0 - # self.storage = ? + self.storage = [] def __len__(self): - pass + return self.size + + def push(self, value): + self.size += 1 + self.storage.append(value) + def pop(self): + if self.size == 0: + return None + self.size -= 1 + return self.storage.pop() + +""" +from singly_linked_list import LinkedList + +class Stack: + def __init__(self): + self.size = 0 + self.storage = LinkedList() + + def __len__(self): + return self.size + def push(self, value): - pass + self.size += 1 + self.storage.add_to_tail(value) def pop(self): - pass + if self.size == 0: + return None + self.size -= 1 + return self.storage.remove_tail()