From 7ccb1d26e32a451e7975ae06770c5523819fc99e Mon Sep 17 00:00:00 2001
From: dholmes4 <dholmes4@huskers.unl.edu>
Date: Thu, 27 Mar 2025 15:33:45 -0500
Subject: [PATCH] Upload New File

---
 lab - linked list lab/linked_list_example.py | 278 +++++++++++++++++++
 1 file changed, 278 insertions(+)
 create mode 100644 lab - linked list lab/linked_list_example.py

diff --git a/lab - linked list lab/linked_list_example.py b/lab - linked list lab/linked_list_example.py
new file mode 100644
index 0000000..356f92f
--- /dev/null
+++ b/lab - linked list lab/linked_list_example.py	
@@ -0,0 +1,278 @@
+class Stack(object):
+    """
+    A basic array-based implementation of a stack.
+    """
+
+    def __init__(self):
+        self.items = []
+
+    def push(self, item):
+        self.items.append(item)
+
+    def pop(self):
+        if self.is_empty():
+            return None
+        return self.items.pop()
+
+    def is_empty(self):
+        return self.items == []
+
+
+class Queue(object):
+    """
+    A basic array-based implementation of a queue.
+    """
+
+    def __init__(self):
+        self.items = []
+
+    def enqueue(self, item):
+        self.items.append(item)
+
+    def dequeue(self):
+        return self.items.pop(0)
+
+    def is_empty(self):
+        return self.items == []
+
+
+class Node(object):
+    """
+    An element in a linked list.
+    """
+
+    def __init__(self, item=None, next_node=None):
+        self.item = item
+        self.next_node = next_node
+
+    def __repr__(self):
+        return repr(self.item)
+
+
+class LinkedStack(object):
+    """
+    Implement a stack ADT based on a singly linked list.
+    """
+
+    def __init__(self):
+        self.head = None
+
+    def push(self, item):
+        new_node = Node(item, self.head)
+        self.head = new_node
+
+    """
+    'yeah make a pop method that just removes the starting value ....
+    now do this step that needs you to have the pop method return the value
+    that's getting popped" 
+        roll of thunder hear me cry.  
+    """
+    def pop(self):
+        returnValue = self.head.item
+        self.head = self.head.next_node
+        return returnValue
+
+    def is_empty(self):
+        return self.head is None
+
+def main():
+    test_linked_queue_duncan_version()
+
+def test_linked_stack_duncan_version():
+    testing_stack = LinkedStack()
+    print("testing_stack : "+str( testing_stack ) )
+    #print("testing_stack.peek() = " + str(testing_stack.peek()))
+    #print("testing_stack.stackSize() = " + str(testing_stack.stackSize()) +"\n")
+    print("testing_stack.is_empty() = " + str(testing_stack.is_empty()) +"\n")
+
+    incoming_value = 1
+    print(f"adding {incoming_value} to testing_stack...")
+    testing_stack.push( incoming_value )
+
+    print("testing_stack : "+str( testing_stack ) +"\n")
+    #print("testing_stack.peek() = " + str(testing_stack.peek()))
+    #print("testing_stack.stackSize() = " + str(testing_stack.stackSize()) + "\n")
+    print("testing_stack.is_empty() = " + str(testing_stack.is_empty()) + "\n")
+
+    incoming_value = 2
+    print(f"adding {incoming_value} to testing_stack...")
+    testing_stack.push( incoming_value )
+
+    print("testing_stack : "+str( testing_stack ) +"\n")
+    #print("testing_stack.peek() = " + str(testing_stack.peek()))
+    #print("testing_stack.stackSize() = " + str(testing_stack.stackSize()) + "\n")
+    print("testing_stack.is_empty() = " + str(testing_stack.is_empty()) + "\n")
+
+    print("i'm going to start popping values now ok???")
+    while not testing_stack.is_empty():
+        print("\t testing_stack.pop() = " + str(testing_stack.pop()))
+    print("program is finalized. have a happy day <3")
+
+
+def test_stack_duncan_version():
+    testing_stack = Stack()
+
+    print("adding element 1 to stack...")
+    testing_stack.push(1)
+    print("adding element 2 to stack...")
+    testing_stack.push(2)
+    print("adding element 3 to stack...")
+    testing_stack.push(3)
+
+    print("testing_stack.pop() = " + str(testing_stack.pop()))
+    print("testing_stack.is_empty() = " + str(testing_stack.is_empty()))
+
+# first in first out
+class LinkedQueue(object):
+    def __init__(self):
+        self.head = None
+        self.tail = None
+
+    # Write an enqueue method to add an item to the queue.
+    def enqueue(self, item):
+        new_node = Node(item, self.tail)
+
+        if self.head is None:
+            self.head = new_node
+            self.tail = new_node
+        else:
+            self.tail.next_node = new_node
+            self.tail = new_node
+
+    # Write a dequeue method to remove an item from the queue.
+    def dequeue(self):
+        returnValue = self.head.item
+        self.head = self.head.next_node
+        return returnValue
+
+    def is_empty(self):
+        return self.head is None
+
+def test_linked_queue_duncan_version():
+    testing_queue = LinkedQueue()
+
+    print("testing_queue.is_empty() = " + str(testing_queue.is_empty()) + "\n")
+
+    temp_value = 1
+    print(f"adding {temp_value} to testing_queue...")
+    testing_queue.enqueue(1)
+
+    temp_value = 2
+    print(f"adding {temp_value} to testing_queue...")
+    testing_queue.enqueue(2)
+
+    temp_value = 3
+    print(f"adding {temp_value} to testing_queue...")
+    testing_queue.enqueue(3)
+
+    temp_value = 4
+    print(f"adding {temp_value} to testing_queue...")
+    testing_queue.enqueue(4)
+
+
+    print("\n")
+    temp_value = 1
+
+    print(f"testing_queue.is_empty: {testing_queue.is_empty()}")
+    while (testing_queue.is_empty() is False) and (temp_value < 5):
+        print(f"dequeueing {temp_value} from testing_queue...")
+        print(f"testing_queue.dequeue: {testing_queue.dequeue()}")
+        temp_value += 1
+
+"""
+Create a DoublyLinkedNode class. Like the Node class, 
+it should have a field for storing data, but it should
+ have both “previous” and “next” references instead of
+  just a “next” reference.
+"""
+class doubly_linked_node(object):
+    def __init__(self, item=None, next_node=None, previous_node=None):
+        self.item = item
+        self.next_node = next_node
+        self.previous_node = previous_node
+
+    def __repr__(self):
+        return repr(self.item)
+
+"""
+Create a LinkedDeque class with both a head and a tail reference.
+ Write a constructor so that it is initially empty.
+"""
+class LinkedDeque(object):
+    def __init__(self):
+        self.head = None
+        self.tail = None
+
+    """
+    Implement an add_back method that takes an item and adds
+     it to the back of the deque. (You might find that your
+      implementation is very similar to code you wrote earlier.)
+    """
+    def add_back(self, item):
+        new_node = Node(item)
+        if self.head is None:
+            self.head = new_node
+            self.tail = new_node
+        else:
+            self.tail.next_node = new_node
+            new_node.previous_node = self.tail
+            self.tail = new_node
+
+    """
+    Implement an add_front method that takes an item and 
+    adds it to the front of the deque. (You might find that
+     your implementation is very similar to that for add_back. 
+     That is okay for now; we have not yet seen any techniques
+      for cleanly dealing with this kind of DRY problem.)
+    """
+    def add_front(self, item):
+        new_node = Node(item)
+        if self.head is None:
+            self.head = new_node
+            self.tail = new_node
+        else:
+            new_node.next_node = self.head
+            self.head.previous_node = new_node
+            self.head = new_node
+
+    """
+    Implement a remove_front method that removes and returns an
+     item from the front of the deque.
+    """
+    def remove_front(self):
+        returnValue = self.head.item
+        self.head = self.head.next_node
+        return returnValue
+
+    """
+    Implement a remove_back method that removes and returns an 
+    item from the back of the deque.
+    """
+    def remove_back(self):
+        returnValue = self.tail.item
+        self.tail = self.tail.previous_node
+        return returnValue
+
+    """
+    Write an is_empty method.
+    """
+    def is_empty(self):
+        return self.head is None
+
+    def print_linked_list(self):
+        current_node = self.head
+        while current_node is not None:
+            print(current_node.item)
+            current_node = current_node.next_node
+
+
+def test_linked_deque_duncan_version():
+    testing_linked_deque = LinkedDeque()
+    testing_linked_deque.add_front(1)
+    testing_linked_deque.add_front(2)
+    testing_linked_deque.add_front(3)
+
+    testing_linked_deque.print_linked_list()
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
-- 
GitLab