-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2. Doubly_Linked_List.py
148 lines (121 loc) · 3.84 KB
/
2. Doubly_Linked_List.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class Node:
def __init__(self, data=None, next=None, prev=None):
self.data = data
self.next = next
self.prev = prev
class DoublyLinkedList:
def __init__(self):
self.head = None
def insert_node_at_beginning(self, data):
if self.head is None:
node = Node(data, self.head, None)
self.head = node
else:
node = Node(data, self.head, None)
self.head.prev = node
self.head = node
def insert_at_end(self, data):
if self.head is None:
self.head = Node(data, None, None)
return
else:
itr = self.head
while itr.next:
itr = itr.next
itr.next = Node(data, None, itr)
def get_length_of_doubly_linked_list(self):
count = 0
itr = self.head
while itr:
count+=1
itr = itr.next
return count
def print_doubly_linked_list(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 remove_at_index(self, index):
if index<0 or index>=self.get_length():
raise Exception("Invalid Index")
if index==0:
self.head = self.head.next
self.head.prev = None
return
count = 0
itr = self.head
while itr:
if count == index - 1:
itr.next = itr.next.next
if itr.next is not None:
itr.next.prev = itr.prev
break
itr = itr.next
count+=1
def insert_at_index(self, index, data):
if index<0 or index>self.get_length():
raise Exception("Invalid Index")
if index==0:
self.insert_at_beginning(data)
return
count = 0
itr = self.head
while itr:
if count == index - 1:
node = Node(data, itr.next, itr)
if node.next is not None:
node.next.prev = node
itr.next = node
break
itr = itr.next
count += 1
def insert_multiple_values_at_index(self, data_list):
self.head = None
for data in data_list:
self.insert_at_end(data)
def print_forward(self):
# This method prints list in forward direction. Use node.next for this.
if self.head is None:
print("Linked list is empty")
return
itr = self.head
llstr = ''
while itr.next is not None:
llstr += str(itr.data)+' --> '
itr = itr.next
llstr += str(itr.data)
print(llstr)
def print_backward(self):
# Print linked list in reverse direction. Use node.prev for this.
iterator = self.head
while iterator.next is not None:
iterator = iterator.next
llstr = ''
while iterator.prev is not None:
llstr += str(iterator.data)+' --> '
iterator = iterator.prev
llstr += str(iterator.data)
print(llstr)
if __name__ == '__main__':
ll = DoublyLinkedList()
ll.insert_values(["banana","mango","grapes","orange"])
ll.print()
ll.print_forward()
ll.print_backward()
ll.insert_at_end("figs")
ll.print_forward()
ll.print_backward()
ll.insert_at(0,"jackfruit")
ll.print_forward()
ll.print_backward()
ll.insert_at(6,"dates")
ll.print_forward()
ll.print_backward()
ll.insert_at(2,"kiwi")
ll.print_forward()
ll.print_backward()