PR Topics:
- Linked Lists
 - Queues
 - Binary Search Trees
 - Heaps
 
- 
Implement each data structure, starting with the linked list data structure. Make sure you're in the approriate directory, then run
python3 test_[NAME OF DATA STRUCTURE].pyto run the tests for that data structure and check your progress. Get all the tests passing for each data structure. - 
Open up the
Data_Structures_Questions.mdfile, which asks you to evaluate the runtime complexity of each of the methods you implemented for each data structure. Add your answers to each of the questions in the file. 
- Should have the methods: 
add_to_tail,remove_head,contains, andget_max.add_to_tailreplaces the tail with a new value that is passed in.remove_headremoves and returns the head node.containsshould search through the linked list and return true if a matching value is found.get_maxreturns the maximum value in the linked list.
 - The 
headproperty is a reference to the first node and thetailproperty is a reference to the last node. Build your nodes with objects. 
- Should have the methods: 
enqueue,dequeue, andlen.enqueueshould add an item to the back of the queue.dequeueshould remove and return an item from the front of the queue.lenreturns the number of items in the queue.
 
- Should have the methods 
insert,contains,get_max.insertadds the input value to the binary search tree, adhering to the rules of the ordering of elements in a binary search tree.containssearches the binary search tree for the input value, returning a boolean indicating whether the value exists in the tree or not.get_maxreturns the maximum value in the binary search tree.
 
- Should have the methods 
insert,delete,get_max,_bubble_up, and_sift_down.insertadds the input value into the heap; this method should ensure that the inserted value is in the correct spot in the heapdeleteremoves and returns the 'topmost' value from the heap; this method needs to ensure that the heap property is maintained after the topmost element has been removed.get_maxreturns the maximum value in the heap in constant time._bubble_upmoves the element at the specified index "up" the heap by swapping it with its parent if the parent's value is less than the value at the specified index._sift_downgrabs the indices of this element's children and determines which child has a larger value. If the larger child's value is larger than the parent's value, the child element is swapped with the parent.
 
- 
Implement a doubly-linked list class that adheres to the following specification. Uncomment the tests in the
tests/doubly-linked-list.test.jsfile in order to test your solution.- 
Consists of a
DoublyLinkedListclass and aListNodeclass. - 
The
ListNodeclass has the methodsinsert_after,insert_before, anddelete.insert_afterinserts a new node with the input value after the calling node.insert_beforeinserts a new node with the input value before the calling node.deleteshould remove the calling node from the list (think about what that means).
 - 
The
DoublyLinkedListclass, like theLinkedListclass, holds references to theheadof the list as well as thetail; it has the methodsadd_to_head,remove_from_head,add_to_tail,remove_from_tail,move_to_front,move_to_back, anddeleteadd_to_headcreates a new node with the input value and adds the new node as the new head of the list.add_to_tailcreates a new node with the input value and adds the new node as the new tail of the list.remove_from_headremoves the current head of the list; the current head's next node should be designated as the new head.remove_from_tailremoves the current tail of the list; the current tail's previous node should be designated as the new tail.move_to_frontreceives a node and moves that node (if it exists in the list) to the front of the list as the new head.move_to_endreceives a node and moves that node (if it exists in the list) to the back of the list as the new tail.deletereceives a node as input and deletes that node from the list.
 
 -