Tutorial 1 - 7 February 2025
This commit is contained in:
		
							parent
							
								
									8cf111ec7a
								
							
						
					
					
						commit
						60ad042acc
					
				
							
								
								
									
										102
									
								
								T1/Q1 - moveEvenItemsToBack_LL.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								T1/Q1 - moveEvenItemsToBack_LL.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | ||||
| class ListNode: | ||||
|     def __init__(self, item): | ||||
|         self.item = item | ||||
|         self.next = None | ||||
| 
 | ||||
| class LinkedList: | ||||
|     def __init__(self): | ||||
|         self.size = 0 | ||||
|         self.head = None | ||||
| 
 | ||||
|     def printList(self): | ||||
|         cur = self.head | ||||
|         if not cur: | ||||
|             print("Empty") | ||||
|             return | ||||
|         while cur: | ||||
|             print(cur.item, end=" ") | ||||
|             cur = cur.next | ||||
|         print() | ||||
| 
 | ||||
|     def removeAllItems(self): | ||||
|         self.head = None | ||||
|         self.size = 0 | ||||
| 
 | ||||
|     def findNode(self, index): | ||||
|         if index < 0 or index >= self.size: | ||||
|             return None | ||||
|         cur = self.head | ||||
|         while index > 0: | ||||
|             cur = cur.next | ||||
|             index -= 1 | ||||
|         return cur | ||||
| 
 | ||||
|     def insertNode(self, index, value): | ||||
|         if index < 0 or index > self.size: | ||||
|             return -1 | ||||
| 
 | ||||
|         newNode = ListNode(value) | ||||
|         if index == 0:  # Insert at the beginning | ||||
|             newNode.next = self.head | ||||
|             self.head = newNode | ||||
|         else: | ||||
|             prev = self.findNode(index - 1) | ||||
|             newNode.next = prev.next | ||||
|             prev.next = newNode | ||||
| 
 | ||||
|         self.size += 1 | ||||
|         return 0 | ||||
| 
 | ||||
|     def removeNode(self, index): | ||||
|         if index < 0 or index >= self.size: | ||||
|             return -1 | ||||
| 
 | ||||
|         if index == 0:  # Remove the first node | ||||
|             self.head = self.head.next | ||||
|         else: | ||||
|             prev = self.findNode(index - 1) | ||||
|             prev.next = prev.next.next | ||||
| 
 | ||||
|         self.size -= 1 | ||||
|         return 0 | ||||
| 
 | ||||
| def moveEvenItemsToBack(ll): | ||||
|     if ll.size < 2: | ||||
|         return | ||||
| 
 | ||||
|     cur = ll.head | ||||
|     index = 0 | ||||
|     for _ in range(ll.size): | ||||
|         if cur.item % 2 == 0: | ||||
|             even_value = cur.item | ||||
|             cur = cur.next | ||||
|             ll.removeNode(index) | ||||
|             ll.insertNode(ll.size, even_value) | ||||
|         else: | ||||
|             cur = cur.next | ||||
|             index += 1 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     ll = LinkedList() | ||||
| 
 | ||||
|     while True: | ||||
|         print("1: Insert an integer to the linked list:") | ||||
|         print("2: Move all even integers to the back of the linked list:") | ||||
|         print("0: Quit:") | ||||
| 
 | ||||
|         choice = int(input("Please input your choice (1/2/0): ")) | ||||
| 
 | ||||
|         if choice == 1: | ||||
|             value = int(input("Input an integer that you want to add to the linked list: ")) | ||||
|             ll.insertNode(ll.size, value) | ||||
|             print("The resulting linked list is:") | ||||
|             ll.printList() | ||||
|         elif choice == 2: | ||||
|             moveEvenItemsToBack(ll) | ||||
|             print("The resulting linked list after moving even integers to the back is:") | ||||
|             ll.printList() | ||||
|         elif choice == 0: | ||||
|             ll.removeAllItems() | ||||
|             break | ||||
|         else: | ||||
|             print("Choice unknown;") | ||||
							
								
								
									
										119
									
								
								T1/Q2 - moveMaxToFront_LL.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								T1/Q2 - moveMaxToFront_LL.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| class ListNode: | ||||
|     def __init__(self, item): | ||||
|         self.item = item | ||||
|         self.next = None | ||||
| 
 | ||||
| class LinkedList: | ||||
|     def __init__(self): | ||||
|         self.size = 0 | ||||
|         self.head = None | ||||
| 
 | ||||
| def printList(ll): | ||||
|     cur = ll.head | ||||
|     if cur is None: | ||||
|         print("Empty") | ||||
|         return | ||||
|     while cur is not None: | ||||
|         print(cur.item, end=" ") | ||||
|         cur = cur.next | ||||
|     print() | ||||
| 
 | ||||
| def findNode(ll, index): | ||||
|     if ll is None or index < 0 or index >= ll.size: | ||||
|         return None | ||||
| 
 | ||||
|     temp = ll.head | ||||
|     while index > 0: | ||||
|         temp = temp.next | ||||
|         if temp is None: | ||||
|             return None | ||||
|         index -= 1 | ||||
| 
 | ||||
|     return temp | ||||
| 
 | ||||
| def insertNode(ll, index, value): | ||||
|     if ll is None or index < 0 or index > ll.size: | ||||
|         return -1 | ||||
| 
 | ||||
|     new_node = ListNode(value) | ||||
| 
 | ||||
|     if index == 0:  # Insert at the beginning | ||||
|         new_node.next = ll.head | ||||
|         ll.head = new_node | ||||
|     else: | ||||
|         pre = findNode(ll, index - 1) | ||||
|         if pre is None: | ||||
|             return -1 | ||||
|         new_node.next = pre.next | ||||
|         pre.next = new_node | ||||
| 
 | ||||
|     ll.size += 1 | ||||
|     return 0 | ||||
| 
 | ||||
| def removeNode(ll, index): | ||||
|     if ll is None or index < 0 or index >= ll.size: | ||||
|         return -1 | ||||
| 
 | ||||
|     if index == 0:  # Remove the first node | ||||
|         ll.head = ll.head.next | ||||
|     else: | ||||
|         pre = findNode(ll, index - 1) | ||||
|         if pre is None or pre.next is None: | ||||
|             return -1 | ||||
|         pre.next = pre.next.next | ||||
| 
 | ||||
|     ll.size -= 1 | ||||
|     return 0 | ||||
| 
 | ||||
| def removeAllItems(ll): | ||||
|     ll.head = None | ||||
|     ll.size = 0 | ||||
| 
 | ||||
| def moveMaxToFront(ll): | ||||
|     if ll.head is None or ll.head.next is None:  # Empty list or single node | ||||
|         return -1 | ||||
| 
 | ||||
|     pre_max = None | ||||
|     max_node = ll.head | ||||
|     cur = ll.head | ||||
| 
 | ||||
|     while cur.next is not None: | ||||
|         if cur.next.item > max_node.item: | ||||
|             pre_max = cur | ||||
|             max_node = cur.next | ||||
|         cur = cur.next | ||||
| 
 | ||||
|     if pre_max is None:  # Max node is already at the front | ||||
|         return 0 | ||||
| 
 | ||||
|     # Move the max node to the front | ||||
|     pre_max.next = max_node.next | ||||
|     max_node.next = ll.head | ||||
|     ll.head = max_node | ||||
| 
 | ||||
|     return 0 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     ll = LinkedList() | ||||
| 
 | ||||
|     while True: | ||||
|         print("1: Insert an integer to the linked list:") | ||||
|         print("2: Move the largest stored value to the front of the list:") | ||||
|         print("0: Quit:") | ||||
| 
 | ||||
|         choice = int(input("Please input your choice (1/2/0): ")) | ||||
| 
 | ||||
|         if choice == 1: | ||||
|             value = int(input("Input an integer that you want to add to the linked list: ")) | ||||
|             insertNode(ll, ll.size, value) | ||||
|             print("The resulting linked list is:") | ||||
|             printList(ll) | ||||
|         elif choice == 2: | ||||
|             moveMaxToFront(ll) | ||||
|             print("The resulting linked list after moving the largest stored value to the front of the list is:") | ||||
|             printList(ll) | ||||
|         elif choice == 0: | ||||
|             removeAllItems(ll) | ||||
|             break | ||||
|         else: | ||||
|             print("Choice unknown.") | ||||
							
								
								
									
										123
									
								
								T1/Q3 - removeDuplicatesSortedLL.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								T1/Q3 - removeDuplicatesSortedLL.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,123 @@ | ||||
| class ListNode: | ||||
|     def __init__(self, item): | ||||
|         self.item = item | ||||
|         self.next = None | ||||
| 
 | ||||
| class LinkedList: | ||||
|     def __init__(self): | ||||
|         self.size = 0 | ||||
|         self.head = None | ||||
| 
 | ||||
| # Function to remove duplicates from a sorted linked list | ||||
| def remove_duplicates_sorted_ll(ll): | ||||
|     current = ll.head | ||||
|     if current is None: | ||||
|         return | ||||
| 
 | ||||
|     while current.next is not None: | ||||
|         if current.item == current.next.item: | ||||
|             temp = current.next.next | ||||
|             current.next = temp | ||||
|             ll.size -= 1 | ||||
|         else: | ||||
|             current = current.next | ||||
| 
 | ||||
| def print_list(ll): | ||||
|     current = ll.head | ||||
|     if current is None: | ||||
|         print("Empty") | ||||
|         return | ||||
| 
 | ||||
|     while current is not None: | ||||
|         print(current.item, end=" ") | ||||
|         current = current.next | ||||
|     print() | ||||
| 
 | ||||
| def remove_all_items(ll): | ||||
|     current = ll.head | ||||
|     while current is not None: | ||||
|         temp = current.next | ||||
|         current = None | ||||
|         current = temp | ||||
| 
 | ||||
|     ll.head = None | ||||
|     ll.size = 0 | ||||
| 
 | ||||
| def find_node(ll, index): | ||||
|     if ll is None or index < 0 or index >= ll.size: | ||||
|         return None | ||||
| 
 | ||||
|     temp = ll.head | ||||
|     while index > 0: | ||||
|         temp = temp.next | ||||
|         if temp is None: | ||||
|             return None | ||||
|         index -= 1 | ||||
| 
 | ||||
|     return temp | ||||
| 
 | ||||
| def insert_node(ll, index, value): | ||||
|     if ll is None or index < 0 or index > ll.size: | ||||
|         return -1 | ||||
| 
 | ||||
|     new_node = ListNode(value) | ||||
| 
 | ||||
|     # If inserting at the head | ||||
|     if index == 0: | ||||
|         new_node.next = ll.head | ||||
|         ll.head = new_node | ||||
|         ll.size += 1 | ||||
|         return 0 | ||||
| 
 | ||||
|     # Insert at other positions | ||||
|     prev_node = find_node(ll, index - 1) | ||||
|     if prev_node is not None: | ||||
|         new_node.next = prev_node.next | ||||
|         prev_node.next = new_node | ||||
|         ll.size += 1 | ||||
|         return 0 | ||||
| 
 | ||||
|     return -1 | ||||
| 
 | ||||
| def remove_node(ll, index): | ||||
|     if ll is None or index < 0 or index >= ll.size: | ||||
|         return -1 | ||||
| 
 | ||||
|     # Remove head node | ||||
|     if index == 0: | ||||
|         ll.head = ll.head.next | ||||
|         ll.size -= 1 | ||||
|         return 0 | ||||
| 
 | ||||
|     # Remove other nodes | ||||
|     prev_node = find_node(ll, index - 1) | ||||
|     if prev_node is not None and prev_node.next is not None: | ||||
|         prev_node.next = prev_node.next.next | ||||
|         ll.size -= 1 | ||||
|         return 0 | ||||
| 
 | ||||
|     return -1 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     ll = LinkedList() | ||||
| 
 | ||||
|     while True: | ||||
|         print("1: Insert an integer to the linked list:") | ||||
|         print("2: Remove duplicates from a sorted linked list:") | ||||
|         print("0: Quit:") | ||||
|         choice = int(input("Please input your choice(1/2/0): ")) | ||||
| 
 | ||||
|         if choice == 1: | ||||
|             value = int(input("Input an integer that you want to add to the linked list: ")) | ||||
|             insert_node(ll, ll.size, value) | ||||
|             print("The resulting linked list is: ") | ||||
|             print_list(ll) | ||||
|         elif choice == 2: | ||||
|             remove_duplicates_sorted_ll(ll) | ||||
|             print("The resulting linked list after removing duplicate values from the sorted linked list is: ") | ||||
|             print_list(ll) | ||||
|         elif choice == 0: | ||||
|             remove_all_items(ll) | ||||
|             break | ||||
|         else: | ||||
|             print("Choice unknown;") | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user