1
+ let CircularLinkedList2 = ( function ( ) {
2
+
3
+ class Node {
4
+ constructor ( element ) {
5
+ this . element = element ;
6
+ this . next = null ;
7
+ }
8
+ }
9
+
10
+ const length = new WeakMap ( ) ;
11
+ const head = new WeakMap ( ) ;
12
+
13
+ class CircularLinkedList2 {
14
+
15
+ constructor ( ) {
16
+ length . set ( this , 0 ) ;
17
+ head . set ( this , null ) ;
18
+ }
19
+
20
+ append ( element ) {
21
+
22
+ let node = new Node ( element ) ,
23
+ current ;
24
+
25
+ if ( this . getHead ( ) === null ) { //first node on list
26
+ head . set ( this , node ) ;
27
+ } else {
28
+
29
+ current = this . getHead ( ) ;
30
+
31
+ //loop the list until find last item
32
+ while ( current . next !== this . getHead ( ) ) { //last element will be head instead of NULL
33
+ current = current . next ;
34
+ }
35
+
36
+ //get last item and assign next to added item to make the link
37
+ current . next = node ;
38
+ }
39
+
40
+ //set node.next to head - to have circular list
41
+ node . next = this . getHead ( ) ;
42
+
43
+ //update size of list
44
+ let l = this . size ( ) ;
45
+ l ++ ;
46
+ length . set ( this , l ) ;
47
+ }
48
+
49
+ insert ( position , element ) {
50
+
51
+ //check for out-of-bounds values
52
+ if ( position >= 0 && position <= this . size ( ) ) {
53
+
54
+ let node = new Node ( element ) ,
55
+ current = this . getHead ( ) ,
56
+ previous ,
57
+ index = 0 ;
58
+
59
+ if ( position === 0 ) { //add on first position
60
+
61
+ node . next = current ;
62
+
63
+ //update last element
64
+ while ( current . next !== head ) { //last element will be head instead of NULL
65
+ current = current . next ;
66
+ }
67
+
68
+ head . set ( this , node ) ;
69
+ current . next = this . getHead ( ) ;
70
+
71
+ } else {
72
+ while ( index ++ < position ) {
73
+ previous = current ;
74
+ current = current . next ;
75
+ }
76
+ node . next = current ;
77
+ previous . next = node ;
78
+ }
79
+
80
+ //update size of list
81
+ let l = this . size ( ) ;
82
+ l ++ ;
83
+ length . set ( this , l ) ;
84
+
85
+ return true ;
86
+
87
+ } else {
88
+ return false ;
89
+ }
90
+ }
91
+
92
+ removeAt ( position ) {
93
+
94
+ //check for out-of-bounds values
95
+ if ( position > - 1 && position < this . size ( ) ) {
96
+
97
+ let current = this . getHead ( ) ,
98
+ previous ,
99
+ index = 0 ;
100
+
101
+ //removing first item
102
+ if ( position === 0 ) {
103
+
104
+ while ( current . next !== head ) { //needs to update last element first
105
+ current = current . next ;
106
+ }
107
+
108
+ head . set ( this , this . getHead ( ) . next ) ;
109
+ current . next = this . getHead ( ) ;
110
+
111
+ } else { //no need to update last element for circular list
112
+
113
+ while ( index ++ < position ) {
114
+
115
+ previous = current ;
116
+ current = current . next ;
117
+ }
118
+
119
+ //link previous with current's next - skip it to remove
120
+ previous . next = current . next ;
121
+ }
122
+
123
+ let l = this . size ( ) ;
124
+ l -- ;
125
+ length . set ( this , l ) ;
126
+
127
+ return current . element ;
128
+
129
+ } else {
130
+ return null ;
131
+ }
132
+ }
133
+
134
+ remove ( element ) {
135
+
136
+ let index = indexOf ( element ) ;
137
+ return removeAt ( index ) ;
138
+ }
139
+
140
+ indexOf ( element ) {
141
+
142
+ let current = this . getHead ( ) ,
143
+ index = - 1 ;
144
+
145
+ //check first item
146
+ if ( element == current . element ) {
147
+ return 0 ;
148
+ }
149
+
150
+ index ++ ;
151
+
152
+ //check in the middle of the list
153
+ while ( current . next !== this . getHead ( ) ) {
154
+
155
+ if ( element == current . element ) {
156
+ return index ;
157
+ }
158
+
159
+ current = current . next ;
160
+ index ++ ;
161
+ }
162
+
163
+ //check last item
164
+ if ( element == current . element ) {
165
+ return index ;
166
+ }
167
+
168
+ return - 1 ;
169
+ }
170
+
171
+ isEmpty ( ) {
172
+ return this . size ( ) === 0 ;
173
+ }
174
+
175
+ size ( ) {
176
+ return length . get ( this ) ;
177
+ }
178
+
179
+ getHead ( ) {
180
+ return head . get ( this ) ;
181
+ }
182
+
183
+ toString ( ) {
184
+
185
+ let current = this . getHead ( ) ,
186
+ s = current . element ;
187
+
188
+ while ( current . next !== this . getHead ( ) ) {
189
+ current = current . next ;
190
+ s += ', ' + current . element ;
191
+ }
192
+
193
+ return s . toString ( ) ;
194
+ }
195
+
196
+ print ( ) {
197
+ console . log ( this . toString ( ) ) ;
198
+ }
199
+ }
200
+ return CircularLinkedList2 ;
201
+ } ) ( ) ;
0 commit comments