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()