1
+ class Node :
2
+ def __init__ (self , data ):
3
+ self .data = data
4
+ self .next = None
5
+ self .prev = None
6
+
7
+
8
+ class CircularDoublyLinkedList :
9
+ def __init__ (self ):
10
+ self .first = None
11
+
12
+ def get_node (self , index ):
13
+ current = self .first
14
+ for i in range (index ):
15
+ current = current .next
16
+ if current == self .first :
17
+ return None
18
+ return current
19
+
20
+ def insert_after (self , ref_node , new_node ):
21
+ new_node .prev = ref_node
22
+ new_node .next = ref_node .next
23
+ new_node .next .prev = new_node
24
+ ref_node .next = new_node
25
+
26
+ def insert_before (self , ref_node , new_node ):
27
+ self .insert_after (ref_node .prev , new_node )
28
+
29
+ def insert_at_end (self , new_node ):
30
+ if self .first is None :
31
+ self .first = new_node
32
+ new_node .next = new_node
33
+ new_node .prev = new_node
34
+ else :
35
+ self .insert_after (self .first .prev , new_node )
36
+
37
+ def insert_at_beg (self , new_node ):
38
+ self .insert_at_end (new_node )
39
+ self .first = new_node
40
+
41
+ def remove (self , node ):
42
+ if self .first .next == self .first :
43
+ self .first = None
44
+ else :
45
+ node .prev .next = node .next
46
+ node .next .prev = node .prev
47
+ if self .first == node :
48
+ self .first = node .next
49
+
50
+ def display (self ):
51
+ if self .first is None :
52
+ return
53
+ current = self .first
54
+ while True :
55
+ print (current .data , end = ' ' )
56
+ current = current .next
57
+ if current == self .first :
58
+ break
59
+
60
+
61
+ a_cdllist = CircularDoublyLinkedList ()
62
+
63
+ print ('Menu' )
64
+ print ('insert <data> after <index>' )
65
+ print ('insert <data> before <index>' )
66
+ print ('insert <data> at beg' )
67
+ print ('insert <data> at end' )
68
+ print ('remove <index>' )
69
+ print ('quit' )
70
+
71
+ while True :
72
+ print ('The list: ' , end = '' )
73
+ a_cdllist .display ()
74
+ print ()
75
+ do = input ('What would you like to do? ' ).split ()
76
+
77
+ operation = do [0 ].strip ().lower ()
78
+
79
+ if operation == 'insert' :
80
+ data = int (do [1 ])
81
+ position = do [3 ].strip ().lower ()
82
+ new_node = Node (data )
83
+ suboperation = do [2 ].strip ().lower ()
84
+ if suboperation == 'at' :
85
+ if position == 'beg' :
86
+ a_cdllist .insert_at_beg (new_node )
87
+ elif position == 'end' :
88
+ a_cdllist .insert_at_end (new_node )
89
+ else :
90
+ index = int (position )
91
+ ref_node = a_cdllist .get_node (index )
92
+ if ref_node is None :
93
+ print ('No such index.' )
94
+ continue
95
+ if suboperation == 'after' :
96
+ a_cdllist .insert_after (ref_node , new_node )
97
+ elif suboperation == 'before' :
98
+ a_cdllist .insert_before (ref_node , new_node )
99
+
100
+ elif operation == 'remove' :
101
+ index = int (do [1 ])
102
+ node = a_cdllist .get_node (index )
103
+ if node is None :
104
+ print ('No such index.' )
105
+ continue
106
+ a_cdllist .remove (node )
107
+
108
+ elif operation == 'quit' :
109
+ break
0 commit comments