1
1
import os
2
2
3
- from typing_extensions import TypeAlias
4
3
5
4
class _Node :
6
5
__slots__ = '_element' , '_link'
@@ -9,8 +8,8 @@ def __init__(self, element, link):
9
8
self ._element = element
10
9
self ._link = link
11
10
12
- class CicularLL :
13
11
12
+ class CicularLL :
14
13
def __init__ (self ):
15
14
self ._head = None
16
15
self ._tail = None
@@ -31,23 +30,94 @@ def addLast(self, e):
31
30
else :
32
31
newest ._link = self ._tail ._link
33
32
self ._tail ._link = newest
34
-
33
+
35
34
self ._tail = newest
36
35
self ._size += 1
37
-
36
+
38
37
def addFirst (self , e ):
39
38
newest = _Node (e , None )
40
39
40
+ newest ._link = self ._head
41
41
if self .isempty ():
42
- newest ._link = self ._head
43
42
self ._head = newest
44
43
self ._tail = newest
45
44
else :
46
- newest ._link = self ._head
47
45
self ._tail ._link = newest
48
46
self ._head = newest
47
+
48
+ self ._size += 1
49
+
50
+ def addAnywhere (self , e , index ):
51
+ newest = _Node (e , None )
52
+ if index >= self ._size :
53
+ print (
54
+ f"Index out of range. It should be between 0 - { self ._size - 1 } " )
55
+ elif self .isempty ():
56
+ print ("List was empty, item will be added in the End." )
57
+ self .addLast (e )
58
+ elif index == 0 :
59
+ self .addFirst (e )
60
+ else :
61
+ p = self ._head
62
+ for _ in range (index - 1 ):
63
+ p = p ._link
64
+ newest ._link = p ._link
65
+ p ._link = newest
66
+ print (f"Added Item at index { index } !\n \n " )
67
+
49
68
self ._size += 1
50
-
69
+
70
+ def removeFirst (self ):
71
+ if self .isempty ():
72
+ print ("List is Empty" )
73
+ return
74
+
75
+ e = self ._head ._element
76
+ self ._head = self ._head ._link
77
+ self ._tail ._link = self ._head
78
+ self ._size -= 1
79
+ return e
80
+
81
+ def removeLast (self ):
82
+ if self .isempty ():
83
+ print ("List is Empty" )
84
+ return
85
+
86
+ p = self ._head # you can also use self._tail._link as it also points to head node
87
+ if p ._link == self ._head :
88
+ return self .removeFirst ()
89
+ else :
90
+ while p ._link ._link != self ._head :
91
+ p = p ._link
92
+ e = p ._link ._element
93
+ p ._link = self ._head
94
+ self ._tail = p
95
+
96
+ self ._size -= 1
97
+ return e
98
+
99
+ def removeAnywhere (self , index ):
100
+
101
+ if index >= self ._size :
102
+ print (
103
+ f"Index out of range. It should be between 0 - { self ._size - 1 } " )
104
+ return
105
+ elif self .isempty ():
106
+ print ("List is Empty" )
107
+ return
108
+ elif index == 0 :
109
+ return self .removeFirst ()
110
+ elif index == self ._size - 1 :
111
+ return self .removeLast ()
112
+ else :
113
+ p = self ._head
114
+ for _ in range (index - 1 ):
115
+ p = p ._link
116
+ e = p ._link ._element
117
+ p ._link = p ._link ._link
118
+
119
+ self ._size -= 1
120
+ return e
51
121
52
122
def display (self ):
53
123
if self .isempty () == 0 :
@@ -78,7 +148,6 @@ def options():
78
148
79
149
80
150
def switch_case (choice ):
81
-
82
151
os .system ('cls' )
83
152
if choice == 1 :
84
153
elem = int (input ("Enter Item: " ))
@@ -94,7 +163,6 @@ def switch_case(choice):
94
163
elem = int (input ("Enter Item: " ))
95
164
index = int (input ("Enter Index: " ))
96
165
CL .addAnywhere (elem , index )
97
- print (f"Added Item at index { index } !\n \n " )
98
166
99
167
elif choice == 4 :
100
168
print ("Removed Element from First:" , CL .removeFirst ())
@@ -104,8 +172,8 @@ def switch_case(choice):
104
172
105
173
elif choice == 6 :
106
174
index = int (input ("Enter Index: " ))
107
- CL .removeAnywhere (index )
108
- print ( f"Removed Item at index { index } ! \n \n " )
175
+ print ( f"Removed Item: { CL .removeAnywhere (index ) } ! \n \n " )
176
+
109
177
elif choice == 7 :
110
178
print ("List: " , end = '' )
111
179
CL .display ()
@@ -115,8 +183,9 @@ def switch_case(choice):
115
183
import sys
116
184
sys .exit ()
117
185
186
+ ###############################################################################
118
187
119
188
CL = CicularLL ()
120
189
while True :
121
190
choice = options ()
122
- switch_case (choice )
191
+ switch_case (choice )
0 commit comments