-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdoubly_linked_list.py
166 lines (148 loc) · 4.59 KB
/
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# for garbege collection
import gc
class Node:
def __init__(self, data= None, prev= None, next= None,):
self.data=data
self.next=next
self.prev=prev
class Doubly_linked_list:
def __init__(self):
self.head=None
def insert_at_beginning(self, data):
# check if DLL is empty
if self.head is None:
# if empty insert at beginning
node=Node(data, None, None)
# now head will point to newly created node
self.head=node
return
# if not empty create a node pointing to current head
node=Node(data,None, self.head )
# now hwad will be marked as newly created node bcz we're inserting at beginning
self.head=node
def delete_beginning(self):
if self.head is None:
print("DLL is Empty")
return
self.head=self.head.next
self.head.prev=None
def delete_end(self):
if self.head is None:
print("DLL is empty")
return
itr=self.head
while itr.next.next:
itr=itr.next
itr.next=None
def insert_at_end(self, data):
# check if DLL is empty
if self.head is None:
# if empty insert at beginning
self.insert_at_beginning(data)
return
# if not empty, travese till end
# head will be assigned to iterator
itr=self.head
# it will iterate untill itr.next points to None i.e. it has reached end
while itr.next:
# each step, next node will be assigned to iterator
itr=itr.next
# we've reached att end, so we'll create a new node
# whose prev will point to current last node(itr) and end will point to None
node=Node(data, itr, None)
itr.next=node
def get_len(self):
if self.head is None:
return 0
count=0
itr=self.head
while itr:
count+=1
itr=itr.next
return count
def delete_node_by_val(self, data):
if self.head is None:
print("DLL is empty")
return
# if data present at beginning
if self.head.data==data:
self.delete_beginning()
return
itr=self.head
# if node is in between start and end
while itr.next.next:
if itr.next.data==data:
temp=itr.next.next
itr.next=itr.next.next
temp.prev=itr
return
itr=itr.next
# if node present at the end
if itr.next.data==data:
self.delete_end()
else:
print(f"node containing data {data} is not present in DLL")
gc.collect()
def insert_after_node(self, node_data, insert_data):
if self.head is None:
print("DLL is empty")
return
itr=self.head
while itr.next:
if itr.data==node_data:
temp=itr.next
node=Node(insert_data, itr,itr.next)
itr.next=node
temp.prev=node
break
itr=itr.next
if itr.data==node_data:
self.insert_at_end(insert_data)
else:
print(f"node data {node_data} not present in DLL")
def print_doubly_LL(self):
# check if empty
if self.head is None:
print("Doubly LL is empty")
return
# if not empty, iterate and print
itr=self.head
while itr:
print(str(itr.data),end="-->")
itr=itr.next
print()
def print_reverse_DLL(self):
if self.head is None:
print("DLL is empty")
return
itr=self.head
# here we'll get the last node
while itr.next:
itr=itr.next
# we have it as our last node
while itr:
print(str(itr.data),end="-->")
itr=itr.prev
'''DLL=Doubly_linked_list()
DLL.insert_at_beginning(10)
DLL.insert_at_beginning(20)
DLL.insert_at_beginning(30)
DLL.insert_at_beginning(40)
DLL.print_doubly_LL()'''
DLL=Doubly_linked_list()
DLL.insert_at_end(10)
DLL.insert_at_end(20)
DLL.insert_at_end(30)
DLL.insert_at_end(40)
DLL.insert_at_end(50)
DLL.print_doubly_LL()
DLL.insert_after_node(50, 60)
DLL.print_doubly_LL()
# DLL.delete_node_by_val(10)
# DLL.print_doubly_LL()
# DLL.print_doubly_LL()
# DLL.delete_beginning()
# DLL.delete_end()
# DLL.print_doubly_LL()
# print(DLL.get_len())
DLL.print_reverse_DLL()