11import os
22
3- from typing_extensions import TypeAlias
43
54class _Node :
65 __slots__ = '_element' , '_link'
@@ -9,8 +8,8 @@ def __init__(self, element, link):
98 self ._element = element
109 self ._link = link
1110
12- class CicularLL :
1311
12+ class CicularLL :
1413 def __init__ (self ):
1514 self ._head = None
1615 self ._tail = None
@@ -31,23 +30,94 @@ def addLast(self, e):
3130 else :
3231 newest ._link = self ._tail ._link
3332 self ._tail ._link = newest
34-
33+ 3534 self ._tail = newest
3635 self ._size += 1
37-
36+ 3837 def addFirst (self , e ):
3938 newest = _Node (e , None )
4039
40+ newest ._link = self ._head
4141 if self .isempty ():
42- newest ._link = self ._head
4342 self ._head = newest
4443 self ._tail = newest
4544 else :
46- newest ._link = self ._head
4745 self ._tail ._link = newest
4846 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+ 4968 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
51121
52122 def display (self ):
53123 if self .isempty () == 0 :
@@ -78,7 +148,6 @@ def options():
78148
79149
80150def switch_case (choice ):
81- 82151 os .system ('cls' )
83152 if choice == 1 :
84153 elem = int (input ("Enter Item: " ))
@@ -94,7 +163,6 @@ def switch_case(choice):
94163 elem = int (input ("Enter Item: " ))
95164 index = int (input ("Enter Index: " ))
96165 CL .addAnywhere (elem , index )
97- print (f"Added Item at index { index } !\n \n " )
98166
99167 elif choice == 4 :
100168 print ("Removed Element from First:" , CL .removeFirst ())
@@ -104,8 +172,8 @@ def switch_case(choice):
104172
105173 elif choice == 6 :
106174 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+ 109177 elif choice == 7 :
110178 print ("List: " , end = '' )
111179 CL .display ()
@@ -115,8 +183,9 @@ def switch_case(choice):
115183 import sys
116184 sys .exit ()
117185
186+ ###############################################################################
118187
119188CL = CicularLL ()
120189while True :
121190 choice = options ()
122- switch_case (choice )
191+ switch_case (choice )
0 commit comments