From 0a1c71e34de2cc1aebe43be33e8b5e90965f31af Mon Sep 17 00:00:00 2001 From: mjk22071998 Date: Tue, 1 Oct 2024 12:53:22 +0500 Subject: [PATCH] Sorted linked list added --- .../linked_list/sorted_linked_list.py | 223 ++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 data_structures/linked_list/sorted_linked_list.py diff --git a/data_structures/linked_list/sorted_linked_list.py b/data_structures/linked_list/sorted_linked_list.py new file mode 100644 index 000000000..60c240080 --- /dev/null +++ b/data_structures/linked_list/sorted_linked_list.py @@ -0,0 +1,223 @@ +from __future__ import annotations + +from collections.abc import Iterator +from dataclasses import dataclass + +""" +This is a sorted linked list class that +creates a sorted linked list of integer datatype +""" + +@dataclass +class Node: + def __init__(self, data): + self.data: int = data + self.next_node: Node | None = None + + def __repr__(self): + return f"Node({self.data}, {self.next_node})" + +class SortedLinedList: + def __init__(self): + self.numNodes : int = 0 + self.head: Node | None = None + self.tail: Node | None = None + + def __repr__(self): + nodes = [] + temp = self.head + while temp: + nodes.append(str(temp.data)) + temp = temp.next_node + return f"SortedLinkedList({', '.join(nodes)})" + + def insert(self, data: int): + """This Function inserts node in it's sorted position + This function can be re written for any data type but + the comparator her must have to be changed + + Args: + data (int): the data of linked list + """ + new_node = Node(data) + if self.head is None: + self.head = new_node + self.tail = new_node + elif data < self.head.data: + new_node.next_node = self.head + self.head = new_node + else: + temp_node = self.head + while temp_node.next_node and temp_node.next_node.data < data: + temp_node = temp_node.next_node + new_node.next_node = temp_node.next_node + temp_node.next_node = new_node + if new_node.next_node is None: + self.tail = new_node + self.numNodes += 1 + + def display(self): + """This function displays whole list + """ + temp=self.head + while temp: + print(temp.data,end=" ") + temp=temp.next_node + print() + + def delete(self, data: int) -> bool: + """This Function deletes first appearance of node with + data from it's sorted position + + This function can be re written for any data type but + the comparator her must have to be changed + + Args: + data (int): the data of the node that is needed to be deleted + + Returns: + bool: status whether the node got deleted or not + """ + if self.head is None: + return False + + if self.head.data == data: + self.head = self.head.next_node + if self.head is None: + self.tail = None + return True + + temp_node = self.head + while temp_node.next_node: + if temp_node.next_node.data == data: + temp_node.next_node = temp_node.next_node.next_node + if temp_node.next_node is None: + self.tail = temp_node + return True + temp_node = temp_node.next_node + + return False + + def search(self, data: int) -> bool: + """This function searches the data given input from user + and return whether the data exists or not + + Args: + data (int): Data to be searched + + Returns: + bool: flag indicating whether data exists or not + """ + temp = self.head + while temp: + if temp.data == data: + return True + temp = temp.next_node + return False + def is_empty(self) -> bool: + """This function will check whether the list is empty or not + + Returns: + bool: flag indicating whether list is empty or not + """ + return self.head is None + + def length (self) -> int: + """This function returns the length of the linked list + + + Returns: + int: The length of linked list + """ + return numNodes + + def min_value(self) -> int | None: + """This function will return minimum value + + Returns: + int | None: min value or None if list is empty + """ + if self.head is None: + return None + return self.head.data + + def max_value(self) -> int | None: + """This function will return maximum value + + + Returns: + int | None: max value or None if list is empty + """ + if self.tail is None: + return None + return self.tail.data + + def remove_duplicates(self): + """This Function will remove the duplicates from the list + """ + temp = self.head + while temp and temp.next_node: + if temp.data == temp.next_node.data: + temp.next_node = temp.next_node.next_node + else: + temp = temp.next_node + + def reverse(self): + """This function will reveres the list + """ + prev = None + current = self.head + while current: + next_node = current.next_node + current.next_node = prev + prev = current + current = next_node + self.head, self.tail = self.tail, self.head + + def merge(self, other_list: SortedLinkedList): + """This Function will merge the input list with current list + + Args: + other_list (SortedLinkedList): The list to be merged + """ + if other_list.head is None: + return + if self.head is None: + self.head = other_list.head + self.tail = other_list.tail + return + self.tail.next_node = other_list.head + self.tail = other_list.tail + + +if __name__ == "__main__": + linkedList=SortedLinedList() + while True: + print("Enter") + print("1. Insert") + print("2. Display") + print("3. Delete") + print("4. Exit") + choice= input("Enter your choice: ") + + if choice == '1': + data = int(input("Enter a number: ")) + linkedList.insert(data) + elif choice == '2': + linkedList.display() + elif choice == '3': + data = int(input("Enter the data to delete: ")) + if linkedList.delete(data): + print("Node with data {} deleted successfully".format(data)) + else: + print("Node with data {} not found in the list".format(data)) + elif choice == '4': + break + else: + print("Wrong input") + + + + + + \ No newline at end of file