Skip to content

Commit e414b5a

Browse files
committed
update double linked list
1 parent b97fa44 commit e414b5a

File tree

2 files changed

+163
-7
lines changed

2 files changed

+163
-7
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
class Node:
2+
def __init__(self, prev=None, data=None, next=None):
3+
self.prev = prev
4+
self.data = data
5+
self.next = next
6+
7+
8+
class DoubleLinkedList:
9+
def __init__(self):
10+
self.head = None # prev, data, next = None
11+
12+
def print_forward(self):
13+
if self.head is None:
14+
raise Exception("The linked list is empty")
15+
16+
current_node = self.head
17+
ll_str = ""
18+
while current_node:
19+
ll_str += str(current_node.data) + '-->' + str(current_node.next.data) if current_node.next else None
20+
current_node = current_node.next
21+
print(ll_str)
22+
def print_backward(self):
23+
if self.head is None:
24+
raise Exception("The linked list is empty")
25+
current_node = self.head
26+
ll_str = ""
27+
while current_node:
28+
if current_node.next:
29+
ll_str += str(current_node.next.data) + str(current_node.data)
30+
else:
31+
ll_str += "" + str(current_node.data)
32+
current_node = current_node.next
33+
print(ll_str)
34+
35+
def get_last_node(self):
36+
if self.head is None:
37+
raise Exception("The list is empty!!")
38+
current_node = self.head
39+
while current_node:
40+
if current_node.next is None:
41+
return current_node
42+
current_node = current_node.next
43+
44+
def get_length(self):
45+
count = 0
46+
current_node = self.head
47+
while current_node:
48+
count += 1
49+
current_node = current_node.next
50+
return count
51+
52+
def insert_at_beginning(self, data):
53+
if self.head is None:
54+
self.head = Node(None, data, None)
55+
return
56+
new_node = Node(None, data, next=self.head)
57+
self.head = new_node
58+
59+
def insert_at_end(self, data):
60+
if self.head is None:
61+
self.head = Node(None, data, None)
62+
return
63+
current_node = self.head
64+
while current_node:
65+
if not current_node.next:
66+
new_node = Node(current_node, data, next=None)
67+
current_node.next = new_node
68+
return
69+
current_node = current_node.next
70+
71+
def insert_at(self, index, data):
72+
if index < 0 or index > self.get_length():
73+
raise Exception("Invalid index had been given !!")
74+
if self.head is None:
75+
if index == 0:
76+
self.head = Node(None, data, None)
77+
return
78+
else:
79+
raise Exception("The list is empty")
80+
curr_ind = 0
81+
curr_node = self.head
82+
while curr_node:
83+
if curr_ind == index - 1:
84+
new_node = Node(curr_node.next, data, curr_node.next.prev)
85+
curr_node.next = new_node
86+
return
87+
curr_node = curr_node.next
88+
def remove_at(self, index):
89+
return
90+
91+
def insert_values(self, data_list):
92+
return
93+
94+
95+
if __name__ == '__main__':
96+
ll = DoubleLinkedList()
97+
ll.insert_values(["banana", "mango", "grapes", "orange"])
98+
ll.print_forward()
99+
ll.print_backward()
100+
ll.insert_at_end("figs")
101+
ll.print_forward()
102+
ll.insert_at(0, "jackfruit")
103+
ll.print_forward()
104+
ll.insert_at(6, "dates")
105+
ll.print_forward()
106+
ll.insert_at(2, "kiwi")
107+
ll.print_forward()

data_structures/3_LinkedList/linked_list.py

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ def print(self):
2323
def get_length(self):
2424
count = 0
2525
current_node = self.head
26-
if current_node:
26+
while current_node:
2727
count += 1
2828
current_node = current_node.next
29-
print("Length of the linked list: ", count)
29+
# print("Length of the linked list: ", count)
3030
return count
3131

3232
def insert_at_beginning(self, data):
@@ -60,6 +60,7 @@ def insert_at(self, index, data):
6060
curr_count += 1
6161

6262
def remove_at(self, index):
63+
6364
if index < 0 or index >= self.get_length():
6465
raise Exception("Invalid index been given!")
6566

@@ -81,14 +82,62 @@ def insert_values(self, data_list):
8182
for data in data_list:
8283
self.insert_at_end(data)
8384

85+
def insert_after_value(self, data_after, data_to_insert):
86+
# search for first occurrence of data_after
87+
# insert data_to_insert after data_after
88+
if self.head is None:
89+
raise Exception("The list is empty!")
90+
current_node = self.head
91+
while current_node:
92+
if str(current_node.data) == str(data_after):
93+
new_node = Node(data_to_insert, current_node.next)
94+
current_node.next = new_node
95+
current_node = current_node.next
96+
97+
def remove_by_value(self, data):
98+
# remove first node that contains data
99+
if self.head is None:
100+
raise Exception("The list is empty!")
101+
102+
if self.head.data == data:
103+
self.head = self.head.next
104+
return
105+
current_node = self.head
106+
while current_node.next:
107+
if current_node.next.data == data:
108+
current_node.next = current_node.next.next
109+
return
110+
current_node = current_node.next
111+
print("value given is not in the linked list")
84112

85113
if __name__ == '__main__':
114+
# ll = SinglyLinkedList()
115+
# ll.insert_values(["banana", "mango", "grapes", "orange"])
116+
# ll.print()
117+
# ll.insert_at(1, "blueberry")
118+
# ll.print()
119+
# ll.remove_at(2)
120+
# ll.print()
121+
#
122+
# ll.insert_values([45, 7, 12, 567, 99])
123+
# ll.print()
124+
# ll.insert_at_end(67)
125+
# ll.print()
126+
86127
ll = SinglyLinkedList()
87128
ll.insert_values(["banana", "mango", "grapes", "orange"])
88-
ll.insert_at(1, "blueberry")
89-
ll.remove_at(2)
90129
ll.print()
91-
92-
ll.insert_values([45, 7, 12, 567, 99])
93-
ll.insert_at_end(67)
130+
ll.insert_after_value("mango", "apple") # insert apple after mango
131+
ll.print()
132+
ll.remove_by_value("orange") # remove orange from linked list
133+
ll.print()
134+
ll.remove_by_value("figs")
135+
ll.print()
136+
ll.remove_by_value("banana")
137+
ll.print()
138+
ll.remove_by_value("mango")
139+
ll.print()
140+
ll.remove_by_value("apple")
94141
ll.print()
142+
ll.remove_by_value("grapes")
143+
ll.print()

0 commit comments

Comments
 (0)