-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcircular_linked_list.py
More file actions
155 lines (137 loc) · 4.04 KB
/
circular_linked_list.py
File metadata and controls
155 lines (137 loc) · 4.04 KB
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
class CLLNode:
def __init__(self, data):
self.data = data
self.next = None
class CLL:
def __init__(self):
self.head = None
self.tail = None
self.len = 0
def __str__(self):
if self.is_empty():
return "list is empty."
result = []
current = self.head
while True:
result.append(str(current.data))
current = current.next
if current == self.head:
break
return " -> ".join(result)
def __len__(self):
return self.len
def __iter__(self):
temp = self.head
for _ in range(self.len):
yield temp.data
temp = temp.next
def is_empty(self):
if self.head is None:
return True
return False
def size(self):
return self.len
def get_head(self):
return self.head
def get_tail(self):
return self.tail
def add_first(self, data):
node = CLLNode(data)
if self.is_empty():
self.head = self.tail = node
node.next = self.head
else:
node.next = self.head
self.head = node
self.tail.next = self.head
self.len += 1
def add_last(self, data):
node = CLLNode(data)
if self.is_empty():
self.head = self.tail = node
node.next = self.head
else:
self.tail.next = node
self.tail = node
self.tail.next = self.head
self.len += 1
def add_after(self, target_node_data, new_data):
if self.is_empty():
raise ValueError("List is empty")
temp = self.head
while temp:
if temp.data == target_node_data:
new_node = CLLNode(new_data)
new_node.next = temp.next
temp.next = new_node
if temp is self.tail:
self.tail = new_node
self.len += 1
return
temp = temp.next
raise ValueError(f"Node not found")
def delete_first(self):
if self.is_empty():
raise ValueError("List is empty")
self.head = self.head.next
self.tail.next = self.head
self.len -= 1
if self.len == 0:
self.head = self.tail = None
def delete_last(self):
if self.is_empty():
raise ValueError("List is empty")
if self.head is self.tail:
self.head = None
self.tail = None
self.len -= 1
else:
temp = self.head
while temp.next is not self.tail:
temp = temp.next
temp.next = self.head
self.tail = temp
self.len -= 1
if self.len == 0:
self.head = self.tail = None
def delete_this(self, data):
if self.is_empty():
raise ValueError("List is empty")
if self.head.data == data:
self.delete_first()
return
temp = self.head
while temp and temp.data != data:
temp = temp.next
if temp.next is None or temp.next == self.head:
raise ValueError(f"Node not found")
if temp.next == self.tail:
self.delete_last()
return
temp.next = temp.next.next
self.len -= 1
def traverse(self):
if self.is_empty():
raise Exception("list is empty")
temp = self.head
elements = []
while True:
elements.append(temp.data)
temp = temp.next
if temp == self.head:
break
return elements
def search(self, value):
if self.is_empty():
raise Exception("list is empty")
temp = self.head
while temp:
if temp.data == value:
return True
temp = temp.next
if temp == self.head:
break
return False
def clear(self):
self.head = self.tail = None
self.len = 0