-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDoubly_linkedlist.py
133 lines (133 loc) · 3.76 KB
/
Doubly_linkedlist.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
class Node:
def __init__(self,data):
self.data=data
self.next=None
self.prev=None
class DoublyLinkedLists:
def __init__(self):
self.head=None
def prepend(self,data):
new_node=Node(data)
if self.head is None:
new_node.prev=None
self.head=new_node
else:
self.head.prev=new_node
new_node.next=self.head
self.head=new_node
new_node.prev=None
def append(self,data):
new_node=Node(data)
if self.head is None:
new_node.prev=None
self.head=new_node
else:
cur=self.head
while cur.next:
cur=cur.next
cur.next=new_node
new_node.prev=cur
new_node.next=None
def print_list(self):
cur=self.head
while cur:
print(cur.data)
cur=cur.next
def add_after_node(self,key,data):
cur=self.head
while cur:
if cur.next is None and cur.data==key:
self.append(data)
return
elif(cur.data==key):
new_node=Node(data)
nxt=cur.next
cur.next=new_node
new_node.next=nxt
new_node.prev=cur
nxt.prev=new_node
cur=cur.next
def add_before_node(self,key,data):
cur=self.head
while cur:
if cur.prev is None and cur.data==key:
self.prepend(data)
return
elif(cur.data==key):
new_node=Node(data)
prev=cur.prev
prev.next=new_node
new_node.next=cur
new_node.prev=prev
cur=cur.next
def delete_node(self,key):
cur=self.head
while cur:
if cur.data==key and cur is self.head:
if not cur.next:
cur=None
self.head=None
return
else:
nxt=cur.next
cur.next=None
nxt.prev=None
cur=None
self.head=nxt
return
elif(cur.data==key):
if cur.next:
nxt=cur.next
prev=cur.prev
prev.next=nxt
nxt.prev=prev
cur.next=None
cur.prev=None
cur=None
return
else:
prev=cur.prev
prev.next=None
cur.prev=None
cur=None
return
cur=cur.next
def reverse(self):
temp=None
cur=self.head
while cur:
temp=cur.prev
cur.prev=cur.next
cur.next=temp
cur=cur.prev
if temp:
self.head=temp.prev
return
def remove_duplicates(self):#for unsorted Doubly_Linked_List
cur=self.head
values=dict()
while cur:
if cur.data not in values:
values[cur.data]="Noted"
cur=cur.next
else:
self.delete_node(cur)
cur=cur.next
dllist=DoublyLinkedLists()
dllist.append(1)
dllist.append(2)
#dllist.prepend(2)
dllist.append(3)
#dllist.prepend(1)
#dllist.append(4)
#dllist.append(4)
#dllist.append(4)
dllist.append(4)
#dllist.append(5)
#dllist.append(5)
dllist.append(5)
#dllist.add_before_node(3,"S")
#dllist.add_after_node(2,"A")
dllist.delete_node(2)
#dllist.reverse()
dllist.print_list()