-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCircularDoublyLinkedList.py
164 lines (144 loc) · 5.15 KB
/
CircularDoublyLinkedList.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
# Created by Elshad Karimov on 12/05/2020.
# Copyright © 2020 AppMillers. All rights reserved.
class Node:
def __init__(self, value=None):
self.value = value
self.next = None
self.prev = None
class CircularDoublyLinkedList:
def __init__(self):
self.head = None
self.tail = None
def __iter__(self):
node = self.head
while node:
yield node
node = node.next
if node == self.tail.next:
break
# Creation of Circular Doubly Linked List
def createCDLL(self, nodeValue):
newNode = Node(nodeValue)
self.head = newNode
self.tail = newNode
newNode.prev = newNode
newNode.next = newNode
return "The CDLL is created successfully"
# Insertion Method in Circular Doubly Linked List
def insertCDLL(self, value, location):
if self.head is None:
return "The CDLL does not exist"
else:
newNode = Node(value)
if location == 0:
newNode.next = self.head
newNode.prev = self.tail
self.head.prev = newNode
self.head = newNode
self.tail.next = newNode
elif location == 1:
newNode.next = self.head
newNode.prev = self.tail
self.head.prev = newNode
self.tail.next = newNode
self.tail = newNode
else:
tempNode = self.head
index = 0
while index < location - 1:
tempNode = tempNode.next
index += 1
newNode.next = tempNode.next
newNode.prev = tempNode
newNode.next.prev = newNode
tempNode.next = newNode
return "The node has been successfully inserted"
# Traversal of Circular Doubly Linked List
def traversalCDLL(self):
if self.head is None:
print("There is not any node for traversal")
else:
tempNode = self.head
while tempNode:
print(tempNode.value)
if tempNode == self.tail:
break
tempNode = tempNode.next
# Reverse traversal of Circular Doubly Linked List
def reverseTraversalCDLL(self):
if self.head is None:
print("There is not any node for reverse traversal")
else:
tempNode = self.tail
while tempNode:
print(tempNode.value)
if tempNode == self.head:
break
tempNode = tempNode.prev
# Search Circular Doubly Linked List
def searchCDLL(self, nodeValue):
if self.head is None:
return "There is not any node in CDLL"
else:
tempNode = self.head
while tempNode:
if tempNode.value == nodeValue:
return tempNode.value
if tempNode == self.tail:
return "The value does not exist in CDLL"
tempNode = tempNode.next
# Delete a node from Circular Doubly Linked List
def deleteNode(self, location):
if self.head is None:
print("There is not any node to delete")
else:
if location == 0:
if self.head == self.tail:
self.head.prev = None
self.head.next = None
self.head = None
self.tail = None
else:
self.head = self.head.next
self.head.prev = self.tail
self.tail.next = self.head
elif location == 1:
if self.head == self.tail:
self.head.prev = None
self.head.next = None
self.head = None
self.tail = None
else:
self.tail = self.tail.prev
self.tail.next = self.head
self.head.prev = self.tail
else:
curNode = self.head
index = 0
while index < location - 1:
curNode = curNode.next
index += 1
curNode.next = curNode.next.next
curNode.next.prev = curNode
print("The node has been successfully deleted")
# Delete entire Circular Doubly Linked List
def deleteCDLL(self):
if self.head is None:
print("There is not any element to delete")
else:
self.tail.next = None
tempNode = self.head
while tempNode:
tempNode.prev = None
tempNode = tempNode.next
self.head = None
self.tail = None
print("The CDLL has been successfully deleted")
circularDLL = CircularDoublyLinkedList()
circularDLL.createCDLL(5)
circularDLL.insertCDLL(0,0)
circularDLL.insertCDLL(1,1)
circularDLL.insertCDLL(2,2)
print([node.value for node in circularDLL])
circularDLL.deleteCDLL()
print([node.value for node in circularDLL])