diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6b76b4f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Current File", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + } + ] +} \ No newline at end of file diff --git a/data_structures/3_LinkedList/3_doubly_linked_list.py b/data_structures/3_LinkedList/3_doubly_linked_list.py new file mode 100644 index 0000000..21200d6 --- /dev/null +++ b/data_structures/3_LinkedList/3_doubly_linked_list.py @@ -0,0 +1,66 @@ +class Node: + def __init__(self, data=None, next=None, prev=None): + self.data = data + self.next = next + self.prev = prev + +class LinkedList: + def __init__(self): + self.head = None + + + def print_forward(self): + if self.head is None: + print("Linked list is empty") + return + itr = self.head + llstr = '' + while itr: + llstr += str(itr.data)+' --> ' if itr.next else str(itr.data) + itr = itr.next + print(llstr) + + def print_backward(self): + if self.head is None: + print("Linked list is empty") + return + itr = self.head + llstr = '' + while itr.next: + itr = itr.next + + while itr: + llstr += str(itr.data)+' --> ' if itr.prev else str(itr.data) + itr = itr.prev + print(llstr) + + def insert_at_begining(self, data): + node = Node(data, self.head) + if self.head: + self.head.prev = node + + self.head = node + + def insert_at_end(self, data): + if self.head is None: + self.head = Node(data, None) + return + + itr = self.head + + while itr.next: + itr = itr.next + + itr.next = Node(data, None, itr) + + def insert_values(self, data_list): + self.head = None + for data in data_list: + self.insert_at_end(data) + +if __name__ == '__main__': + ll = LinkedList() + ll.insert_values(["banana","mango","grapes","orange"]) + + ll.print_forward() + ll.print_backward() diff --git a/data_structures/3_LinkedList/3_linked_list.py b/data_structures/3_LinkedList/3_linked_list.py index a6d9466..1ef0045 100644 --- a/data_structures/3_LinkedList/3_linked_list.py +++ b/data_structures/3_LinkedList/3_linked_list.py @@ -85,15 +85,42 @@ def insert_values(self, data_list): for data in data_list: self.insert_at_end(data) + def insert_after_value(self, data_after, data_to_insert): + itr = self.head + while itr: + if itr.data == data_after: + new_node = Node(data_to_insert, itr.next) + itr.next = new_node + break + itr = itr.next + + def remove_by_value(self, data): + itr = self.head + prev = None + while itr: + if itr.data == data: + if prev: + prev.next = itr.next + break + else: + self.head = itr.next + + prev = itr + itr = itr.next if __name__ == '__main__': ll = LinkedList() ll.insert_values(["banana","mango","grapes","orange"]) - ll.insert_at(1,"blueberry") - ll.remove_at(2) ll.print() - - ll.insert_values([45,7,12,567,99]) - ll.insert_at_end(67) + ll.insert_after_value("mango","apple") # insert apple after mango + ll.print() + ll.remove_by_value("orange") # remove orange from linked list + ll.print() + ll.remove_by_value("figs") + ll.print() + ll.remove_by_value("banana") + ll.remove_by_value("mango") + ll.remove_by_value("apple") + ll.remove_by_value("grapes") ll.print()