diff --git a/Exercise_1.py b/Exercise_1.py index 532833f5d..1a83b4321 100644 --- a/Exercise_1.py +++ b/Exercise_1.py @@ -2,19 +2,30 @@ class myStack: #Please read sample.java file before starting. #Kindly include Time and Space complexity at top of each file def __init__(self): + self.stack = [] def isEmpty(self): + return len(self.stack) == 0 def push(self, item): + self.stack.append(item) def pop(self): - + if self.isEmpty(): + return None + + return self.stack.pop() def peek(self): + if self.isEmpty(): + return None + return self.stack[-1] def size(self): + return len(self.stack) def show(self): + return self.stack s = myStack() diff --git a/Exercise_2.py b/Exercise_2.py index b11492215..7b9379581 100644 --- a/Exercise_2.py +++ b/Exercise_2.py @@ -6,10 +6,21 @@ def __init__(self, data): class Stack: def __init__(self): + self.top = None def push(self, data): - + new_node = Node(data) + new_node.next = self.top + self.top = new_node + def pop(self): + if self.top is None: + return None + + popped = self.top.data + self.top = self.top.next + + return popped a_stack = Stack() while True: diff --git a/Exercise_3.py b/Exercise_3.py index a5d466b59..cb1226013 100644 --- a/Exercise_3.py +++ b/Exercise_3.py @@ -3,6 +3,8 @@ class ListNode: A node in a singly-linked list. """ def __init__(self, data=None, next=None): + self.data = data + self.next = next class SinglyLinkedList: def __init__(self): @@ -17,6 +19,15 @@ def append(self, data): Insert a new element at the end of the list. Takes O(n) time. """ + new_node = ListNode(data) + if self.head is None: + self.head = new_node + return + current = self.head + while current.next: + current = current.next + + current.next = new_node def find(self, key): """ @@ -24,9 +35,62 @@ def find(self, key): `key`. Return the element or `None` if not found. Takes O(n) time. """ - + current = self.head + while current: + if current.data == key: + return current + current = current.next + return None + + def remove(self, key): """ Remove the first occurrence of `key` in the list. Takes O(n) time. """ + if self.head is None: + return + + # If the head is the node we want to remove + if self.head.data == key: + self.head = self.head.next + return + current = self.head + while current: + if current.next.data == key: + current.next = current.next.next + return + current = current.next + + def print_list(self): + current = self.head + + while current: + print(current.data, end=" -> ") + current = current.next + + print("None") + + +# Test +linked_list = SinglyLinkedList() + +linked_list.append(10) +linked_list.append(20) +linked_list.append(30) +linked_list.append(40) + +print("Original list:") +linked_list.print_list() + +print("\nFinding 20:") +node = linked_list.find(20) +print(node.data if node else None) + +print("\nRemoving 20:") +linked_list.remove(20) +linked_list.print_list() + +print("\nRemoving head (10):") +linked_list.remove(10) +linked_list.print_list() \ No newline at end of file