Skip to content

Commit e3c7840

Browse files
committed
answers for double_linked_list practice probs
1 parent f81b1fa commit e3c7840

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
class Node:
2+
def __init__(self, data=None, next=None, prev=None):
3+
self.data = data
4+
self.next = next
5+
self.prev = prev
6+
7+
8+
class DoubleLinkedList:
9+
def __init__(self):
10+
self.head = None
11+
self.tail = None
12+
13+
def isHead(self, node):
14+
return(node == self.head)
15+
16+
def isTail(self, node):
17+
return(node == self.tail)
18+
19+
def print_forward(self):
20+
# This method prints list in forward direction. Use node.next
21+
if self.head is None:
22+
print("Double linked list is empty")
23+
return
24+
itr = self.head
25+
llstr = ''
26+
while itr:
27+
llstr += str(itr.data) + ' --> ' if itr.next else str(itr.data)
28+
itr = itr.next
29+
print(llstr)
30+
31+
def print_backward(self):
32+
# Print linked list in reverse direction. Use node.prev for this.
33+
if self.tail is None:
34+
print("Double linked list is empty")
35+
return
36+
itr = self.tail
37+
llstr = ''
38+
while itr:
39+
llstr += str(itr.data) + ' <-- ' if itr.prev else str(itr.data)
40+
itr = itr.prev
41+
print(llstr)
42+
43+
def get_length(self):
44+
count = 0
45+
itr = self.head
46+
while itr:
47+
count += 1
48+
itr = itr.next
49+
return count
50+
51+
def insert_at_beginning(self, data):
52+
if self.get_length() == 0:
53+
node = Node(data)
54+
self.head = node
55+
self.tail = node
56+
else:
57+
old_head = self.head
58+
node = Node(data, old_head)
59+
self.head = node
60+
old_head.prev = node
61+
62+
def insert_at_end(self, data):
63+
if self.get_length() == 0:
64+
self.insert_at_beginning(data)
65+
else:
66+
old_tail = self.tail
67+
node = Node(data, None, old_tail)
68+
self.tail = node
69+
old_tail.next = node
70+
71+
def insert_at(self, index, data):
72+
if index < 0 or index >= self.get_length():
73+
raise Exception("Invalid Index")
74+
if index == 0:
75+
self.insert_at_beginning(data)
76+
itr = self.head
77+
count = 0
78+
while itr:
79+
if count == index - 1:
80+
next_node = itr.next
81+
node = Node(data, next_node, itr)
82+
itr.next = node
83+
next_node.prev = node
84+
break
85+
count += 1
86+
itr = itr.next
87+
88+
def remove_at(self, index):
89+
# index doesn't match
90+
if index < 0 or index >= self.get_length():
91+
raise Exception("Invalid Index")
92+
# remove head
93+
if index == 0:
94+
if self.isTail(self.head):
95+
self.tail = None
96+
self.head = None
97+
else:
98+
self.head = self.head.next
99+
self.head.prev = None
100+
return
101+
# remove head
102+
if index == self.get_length() - 1:
103+
self.tail = self.tail.prev
104+
self.tail.next = None
105+
return
106+
# other cases
107+
itr = self.head
108+
count = 0
109+
while itr.next:
110+
if count == index - 1:
111+
if self.isTail(itr.next):
112+
itr.next.next = None
113+
else:
114+
itr.next.next.prev = itr
115+
itr.next = itr.next.next
116+
break
117+
itr = itr.next
118+
count += 1
119+
120+
def insert_values(self, data_list):
121+
self.head = None
122+
self.tail = None
123+
for data in data_list:
124+
self.insert_at_end(data)
125+
126+
def insert_after_value(self, data_after, data_to_insert):
127+
itr = self.head
128+
while itr:
129+
if itr.data == data_after:
130+
node = Node(data_to_insert, itr.next, itr)
131+
itr.next.prev = node
132+
itr.next = node
133+
break
134+
itr = itr.next
135+
136+
def remove_by_value(self, data):
137+
itr = self.head
138+
while itr:
139+
if itr.data == data:
140+
if self.isHead(itr):
141+
if self.isTail(itr):
142+
self.head = None
143+
self.tail = None
144+
else:
145+
self.head = itr.next
146+
self.head.prev = None
147+
elif self.isTail(itr):
148+
self.tail = self.tail.prev
149+
self.tail.next = None
150+
else:
151+
itr.prev.next = itr.next
152+
itr.next.prev = itr.prev
153+
break
154+
itr = itr.next
155+
156+
157+
if __name__ == '__main__':
158+
ll = DoubleLinkedList()
159+
ll.insert_values([45, 7, 12, 567, 99])
160+
ll.remove_by_value(99)
161+
ll.print_forward()

0 commit comments

Comments
 (0)