1+ from turtle import mode
2+
3+
4+ class Node :
5+ def __init__ (self , data , next = None ):
6+ self .data = data
7+ self .next = next
8+
9+ class CircularLinkedList :
10+ def __init__ (self ):
11+ self .head = self .tail = None
12+ self .length = 0
13+
14+ def insert_at_beginning (self , data ):
15+ node = Node (data , self .head )
16+ if self .head is None :
17+ self .head = self .tail = node
18+ node .next = node
19+ self .length += 1
20+ return
21+ self .head = node
22+ self .tail .next = node
23+ self .length += 1
24+
25+ def insert_at_end (self , data ):
26+ node = Node (data , self .head )
27+ if self .head is None :
28+ self .head = self .tail = node
29+ node .next = node
30+ self .length += 1
31+ return
32+ self .tail .next = node
33+ self .tail = node
34+ self .length += 1
35+
36+ def len (self ):
37+ return self .length
38+
39+ def pop_at_beginning (self ):
40+ if self .head is None :
41+ print ('List is Empty!' )
42+ return
43+ self .head = self .head .next
44+ self .tail .next = self .head
45+ self .length -= 1
46+
47+ def pop_at_end (self ):
48+ if self .head is None :
49+ print ('List is Empty!' )
50+ return
51+ temp = self .head
52+ while temp :
53+ if temp .next is self .tail :
54+ self .tail .next = None
55+ self .tail = temp
56+ temp .next = self .head
57+ self .length -= 1
58+ return
59+ temp = temp .next
60+
61+ def insert_values (self , arr : list ):
62+ self .head = self .tail = None
63+ self .length = 0
64+ for i in arr :
65+ self .insert_at_end (i )
66+
67+ def print (self ):
68+ if self .head is None :
69+ print ('The List is Empty!' )
70+ return
71+ temp = self .head .next
72+ print (f'{ self .head .data } ->' , end = ' ' )
73+ while temp != self .head :
74+ print (f'{ temp .data } ->' , end = ' ' )
75+ temp = temp .next
76+ print (f'{ self .tail .next .data } ' )
77+
78+ def insert_at (self , idx , data ):
79+ if idx == 0 :
80+ self .insert_at_beginning (data )
81+ return
82+ elif idx == self .length :
83+ self .insert_at_end (data )
84+ return
85+ elif 0 > idx or idx > self .length :
86+ raise Exception ('Invalid Position' )
87+ return
88+ pos = 0
89+ temp = self .head
90+ while temp :
91+ if pos == idx - 1 :
92+ node = Node (data , temp .next )
93+ temp .next = node
94+ self .length += 1
95+ return
96+ pos += 1
97+ temp = temp .next
98+
99+ def remove_at (self , idx ):
100+ if 0 > idx or idx >= self .length :
101+ raise Exception ('Invalid Position' )
102+ elif idx == 0 :
103+ self .pop_at_beginning ()
104+ return
105+ elif idx == self .length - 1 :
106+ self .pop_at_end ()
107+ return
108+ temp = self .head
109+ pos = 0
110+ while temp :
111+ if pos == idx - 1 :
112+ temp .next = temp .next .next
113+ self .length -= 1
114+ return
115+ pos += 1
116+ temp = temp .next
117+
118+ def main ():
119+ ll = CircularLinkedList ()
120+ ll .insert_at_end (1 )
121+ ll .insert_at_end (4 )
122+ ll .insert_at_end (3 )
123+ ll .insert_at_beginning (2 )
124+ ll .insert_values ([1 , 2 , 3 ,4 ,5 ,6 ,53 ,3 ])
125+ # ll.pop_at_end()
126+ ll .insert_at (8 , 7 )
127+ # ll.remove_at(2)
128+ ll .print ()
129+ print (f'{ ll .len () = } ' )
130+
131+
132+
133+ if __name__ == '__main__' :
134+ main ()
0 commit comments