@@ -26,10 +26,12 @@ class forward_lists{
26
26
};
27
27
int size;
28
28
Node* head;
29
+ Node* tail;
29
30
public:
30
31
forward_lists (){
31
32
this ->head = new Node (T{});
32
33
this ->head ->next = nullptr ;
34
+ this ->tail = this ->head ;
33
35
this ->size = 0 ;
34
36
}
35
37
/* *
@@ -45,23 +47,25 @@ class forward_lists{
45
47
head = new Node (T{});
46
48
size = 0 ;
47
49
head->next = nullptr ;
48
- Node** curr = &head->next ; // curr menunjuk head->next
50
+ tail = head;
51
+ Node** curr = &tail->next ; // curr menunjuk head->next
49
52
while (begin != end){
50
- *curr = new Node (*begin); // isi node
53
+ *curr = new Node (*begin); // isi node
51
54
curr = &((*curr)->next ); // curr = curr->next
52
55
size++; // increment size
53
56
++begin; // increment iterator
54
57
}
55
58
}
56
59
/* *
57
60
* @brief initializer list constructor
58
- * @details
61
+ * @details time complexity O(n),Space Complexity O(n)
59
62
*/
60
63
forward_lists (std::initializer_list<T> arr): head(nullptr ){
61
64
head = new Node (T{});
62
65
head->next = nullptr ;
66
+ tail = head;
63
67
size = 0 ;
64
- Node** curr = &head ->next ; // store alamat memory head ke curr
68
+ Node** curr = &tail ->next ; // store alamat memory head ke curr
65
69
for (const T& it: arr){
66
70
*curr = new Node (it); // deference pointer
67
71
// head = new Node(it) ->meaning
@@ -252,36 +256,47 @@ class forward_lists{
252
256
*
253
257
* @details Time complexity O(1),Space Complexity O(1)
254
258
*/
255
- void push_front (const T&& data){
256
- Node* pos = head;
257
- Node* new_node = new Node (data);
258
- new_node->next = pos->next ;
259
- pos->next = new_node;
260
- size++;
259
+ void push_front (T&& data){ // forwadding reference
260
+ if (tail == head){
261
+ Node* new_node = new Node (data);
262
+ head->next = tail = new_node;
263
+ size++;
264
+ }else {
265
+ Node* new_node = new Node (data);
266
+ new_node->next = head->next ;
267
+ head->next = new_node;
268
+ size++;
269
+ }
261
270
}
262
271
void push_front (const T& data){
263
- Node* pos = before_begin ().get_raw ();
264
- Node* new_node = new Node (data);
265
- new_node->next = pos->next ;
266
- pos->next = new_node;
267
- size++;
272
+ if (tail == head){
273
+ Node* new_node = new Node (data);
274
+ head->next = tail = new_node;
275
+ size++;
276
+ }else {
277
+ Node* new_node = new Node (data);
278
+ new_node->next = head->next ;
279
+ head->next = new_node;
280
+ size++;
281
+ }
268
282
}
269
283
/* *
270
284
* @brief method untuk deletion val pada pos front
271
285
*
272
286
* @details Time complexity O(1),Space Complexity O(1)
273
287
*/
274
288
void pop_front (){
275
- Node* pos = head;
276
- Node* first = head->next ;
277
- if (!first){
289
+ if (tail == head){
278
290
return ;
291
+ }else if (head->next == tail->next ){
292
+ head = tail = nullptr ;
293
+ size--;
294
+ }else {
295
+ Node* temp = head->next ;
296
+ Node* next = head->next ;
297
+ head->next = next->next ;
298
+ delete temp;
279
299
}
280
- Node* temp = first;
281
- first = first->next ;
282
- pos->next = first;
283
- size--;
284
- delete temp;
285
300
}
286
301
/* *
287
302
* @brief Menyisipkan elemen setelah posisi iterator tertentu.
@@ -335,12 +350,20 @@ class forward_lists{
335
350
Node* new_node = new Node (val);
336
351
new_node->next = curr->next ;
337
352
curr->next = new_node;
353
+ if (curr == tail){ // jika posisi curr sama dengan tail
354
+ tail = new_node;
355
+ }
356
+ size++; // update size
338
357
}
339
358
void insert_after (Iterator iter_position,const T& val){
340
359
Node* curr = iter_position.get_raw ();
341
360
Node* new_node = new Node (val);
342
361
new_node->next = curr->next ;
343
362
curr->next = new_node;
363
+ if (curr == tail){
364
+ tail = new_node; // update tail
365
+ }
366
+ size++; // increment size
344
367
}
345
368
void insert_after (Iterator Iterator_position,int n,T&& val){
346
369
Node* curr = Iterator_position.get_raw ();
@@ -351,16 +374,22 @@ class forward_lists{
351
374
Node* new_node = new Node (val);
352
375
new_node->next = curr->next ;
353
376
curr->next = new_node;
377
+ if (curr == tail){
378
+ tail = new_node;
379
+ }
354
380
}else {
355
381
Node* new_node = new Node (val);
356
- Node* tail = new_node;
382
+ Node* n_tail = new_node;
357
383
for (int i = 0 ;i < n - 1 ;i++){
358
384
Node* baru = new Node (val);
359
- tail ->next = baru;
360
- tail = baru;
385
+ n_tail ->next = baru;
386
+ n_tail = baru;
361
387
}
362
- tail ->next = curr->next ;
388
+ n_tail ->next = curr->next ;
363
389
curr->next = new_node;
390
+ if (curr == tail){
391
+ tail = n_tail; // karena n_tail menunju node terakhir saat insertion
392
+ }
364
393
}
365
394
}
366
395
void insert_after (Iterator Iterator_position,int n,const T& val){
@@ -372,16 +401,22 @@ class forward_lists{
372
401
Node* new_node = new Node (val);
373
402
new_node->next = curr->next ;
374
403
curr->next = new_node;
404
+ if (curr == tail){
405
+ tail = new_node;
406
+ }
375
407
}else {
376
408
Node* new_node = new Node (val);
377
- Node* tail = new_node;
409
+ Node* n_tail = new_node;
378
410
for (int i = 0 ;i < n - 1 ;i++){
379
411
Node* baru = new Node (val);
380
- tail ->next = baru;
381
- tail = baru;
412
+ n_tail ->next = baru;
413
+ n_tail = baru;
382
414
}
383
- tail ->next = curr->next ;
415
+ n_tail ->next = curr->next ;
384
416
curr->next = new_node;
417
+ if (curr == tail){
418
+ tail = n_tail;
419
+ }
385
420
}
386
421
}
387
422
template <std::input_iterator It>
@@ -390,60 +425,86 @@ class forward_lists{
390
425
Node* curr = iter_position.get_raw ();
391
426
Node* new_node = new Node (*itr1);
392
427
size++;
393
- Node* tail = new_node;
428
+ Node* n_tail = new_node;
394
429
++itr1;
395
430
while (itr1 != itr2){
396
- Node* n_node = new Node (*itr1);
397
- ++itr1;
398
- tail ->next = n_node;
399
- tail = n_node;
431
+ Node* n_node = new Node (*itr1); // deferencing itr1
432
+ ++itr1; // increment iterator itr1
433
+ n_tail ->next = n_node;
434
+ n_tail = n_node;
400
435
size++;
401
436
}
402
- tail ->next = curr->next ;
437
+ n_tail ->next = curr->next ;
403
438
curr->next = new_node;
439
+ if (curr == tail){
440
+ tail = n_tail;
441
+ }
404
442
}
405
443
void insert_after (const Iterator iter_position,Iterator listBegin,const Iterator listEnd){
406
444
Node* curr = iter_position.get_raw ();
407
445
Node* new_head = listBegin.get_raw ();
408
446
Node* end = listEnd.get_raw ();
409
447
Node* new_node = new Node (new_head->data );
410
448
size++;
411
- Node* tail = new_node;
449
+ Node* n_tail = new_node;
412
450
new_head = new_head->next ;
413
451
while (new_head != end){
414
452
Node* n_node = new Node (new_head->data );
415
- tail ->next = n_node;
416
- tail = n_node;
453
+ n_tail ->next = n_node;
454
+ n_tail = n_node;
417
455
new_head = new_head->next ;
418
456
size++;
419
457
}
420
- tail ->next = curr->next ;
458
+ n_tail ->next = curr->next ;
421
459
curr->next = new_node;
460
+ if (curr == tail){
461
+ tail = new_node;
462
+ }
422
463
}
423
464
public: // overload erase after
424
465
void erase_after (const Iterator iter_position){
425
466
Node* curr = iter_position.get_raw ();
426
- if (!curr->next ){
427
- return ;
467
+ if (!curr->next ){// tidak ada node setelah posisi iterator
468
+ return ; // return
469
+ }
470
+ if (curr->next == tail){ // jika node selanjutnya tail
471
+ Node* temp = curr->next ;
472
+ tail = curr; // tail sekarang curr
473
+ delete temp;
474
+ size--;
475
+ }else { //
476
+ Node* temp = curr->next ;
477
+ curr->next = temp->next ;
478
+ size--;
479
+ delete temp;
428
480
}
429
- Node* temp = curr->next ;
430
- curr->next = temp->next ;
431
- size--;
432
- delete temp;
433
481
}
434
482
void erase_after (const Iterator pos_begin,const Iterator pos_end){
435
483
Node* first = pos_begin.get_raw ();
484
+ Node* fst = pos_begin.get_raw ();
436
485
Node* curr = first->next ;
437
486
Node* last = pos_end.get_raw ();
438
487
// curr = curr->next;
439
488
while (curr != last){
440
- Node* temp = curr;
441
- curr = curr->next ;
442
- delete temp;
443
- size--;
489
+ if (curr == tail){
490
+ Node* temp = curr;
491
+ tail = fst;
492
+ curr = curr->next ;
493
+ delete temp;
494
+ size--;
495
+ }else {
496
+ Node* temp = curr;
497
+ curr = curr->next ;
498
+ delete temp;
499
+ size--;
500
+ }
444
501
}
445
502
first->next = last;
503
+ if (last == nullptr ){
504
+ tail = first;
505
+ }
446
506
}
507
+
447
508
public: // reverse method
448
509
void reverse (){
449
510
Node* prev = nullptr ;
0 commit comments