Skip to content

Commit 4af00c5

Browse files
authored
Merge pull request #32 from yusuf601/feat/tail_pointer
refactor: menambahkan implementasi tail pointer
2 parents 632a89a + 36251e2 commit 4af00c5

File tree

1 file changed

+112
-51
lines changed

1 file changed

+112
-51
lines changed

header/forward_list.hpp

Lines changed: 112 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ class forward_lists{
2626
};
2727
int size;
2828
Node* head;
29+
Node* tail;
2930
public:
3031
forward_lists(){
3132
this->head = new Node(T{});
3233
this->head->next = nullptr;
34+
this->tail = this->head;
3335
this->size = 0;
3436
}
3537
/**
@@ -45,23 +47,25 @@ class forward_lists{
4547
head = new Node(T{});
4648
size = 0;
4749
head->next = nullptr;
48-
Node** curr = &head->next; //curr menunjuk head->next
50+
tail = head;
51+
Node** curr = &tail->next; //curr menunjuk head->next
4952
while(begin != end){
50-
*curr = new Node(*begin); //isi node
53+
*curr = new Node(*begin); //isi node
5154
curr = &((*curr)->next); //curr = curr->next
5255
size++; //increment size
5356
++begin; //increment iterator
5457
}
5558
}
5659
/**
5760
* @brief initializer list constructor
58-
* @details
61+
* @details time complexity O(n),Space Complexity O(n)
5962
*/
6063
forward_lists(std::initializer_list<T> arr): head(nullptr){
6164
head = new Node(T{});
6265
head->next = nullptr;
66+
tail = head;
6367
size = 0;
64-
Node** curr = &head->next; //store alamat memory head ke curr
68+
Node** curr = &tail->next; //store alamat memory head ke curr
6569
for(const T& it: arr){
6670
*curr = new Node(it); //deference pointer
6771
//head = new Node(it) ->meaning
@@ -252,36 +256,47 @@ class forward_lists{
252256
*
253257
* @details Time complexity O(1),Space Complexity O(1)
254258
*/
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+
}
261270
}
262271
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+
}
268282
}
269283
/**
270284
* @brief method untuk deletion val pada pos front
271285
*
272286
* @details Time complexity O(1),Space Complexity O(1)
273287
*/
274288
void pop_front(){
275-
Node* pos = head;
276-
Node* first = head->next;
277-
if(!first){
289+
if(tail == head){
278290
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;
279299
}
280-
Node* temp = first;
281-
first = first->next;
282-
pos->next = first;
283-
size--;
284-
delete temp;
285300
}
286301
/**
287302
* @brief Menyisipkan elemen setelah posisi iterator tertentu.
@@ -335,12 +350,20 @@ class forward_lists{
335350
Node* new_node = new Node(val);
336351
new_node->next = curr->next;
337352
curr->next = new_node;
353+
if(curr == tail){ //jika posisi curr sama dengan tail
354+
tail = new_node;
355+
}
356+
size++; //update size
338357
}
339358
void insert_after(Iterator iter_position,const T& val){
340359
Node* curr = iter_position.get_raw();
341360
Node* new_node = new Node(val);
342361
new_node->next = curr->next;
343362
curr->next = new_node;
363+
if(curr == tail){
364+
tail = new_node; //update tail
365+
}
366+
size++; //increment size
344367
}
345368
void insert_after(Iterator Iterator_position,int n,T&& val){
346369
Node* curr = Iterator_position.get_raw();
@@ -351,16 +374,22 @@ class forward_lists{
351374
Node* new_node = new Node(val);
352375
new_node->next = curr->next;
353376
curr->next = new_node;
377+
if(curr == tail){
378+
tail = new_node;
379+
}
354380
}else{
355381
Node* new_node = new Node(val);
356-
Node* tail = new_node;
382+
Node* n_tail = new_node;
357383
for(int i = 0;i < n - 1;i++){
358384
Node* baru = new Node(val);
359-
tail->next = baru;
360-
tail = baru;
385+
n_tail->next = baru;
386+
n_tail = baru;
361387
}
362-
tail->next = curr->next;
388+
n_tail->next = curr->next;
363389
curr->next = new_node;
390+
if(curr == tail){
391+
tail = n_tail; //karena n_tail menunju node terakhir saat insertion
392+
}
364393
}
365394
}
366395
void insert_after(Iterator Iterator_position,int n,const T& val){
@@ -372,16 +401,22 @@ class forward_lists{
372401
Node* new_node = new Node(val);
373402
new_node->next = curr->next;
374403
curr->next = new_node;
404+
if(curr == tail){
405+
tail = new_node;
406+
}
375407
}else{
376408
Node* new_node = new Node(val);
377-
Node* tail = new_node;
409+
Node* n_tail = new_node;
378410
for(int i = 0;i < n - 1;i++){
379411
Node* baru = new Node(val);
380-
tail->next = baru;
381-
tail = baru;
412+
n_tail->next = baru;
413+
n_tail = baru;
382414
}
383-
tail->next = curr->next;
415+
n_tail->next = curr->next;
384416
curr->next = new_node;
417+
if(curr == tail){
418+
tail = n_tail;
419+
}
385420
}
386421
}
387422
template<std::input_iterator It>
@@ -390,60 +425,86 @@ class forward_lists{
390425
Node* curr = iter_position.get_raw();
391426
Node* new_node = new Node(*itr1);
392427
size++;
393-
Node* tail = new_node;
428+
Node* n_tail = new_node;
394429
++itr1;
395430
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;
400435
size++;
401436
}
402-
tail->next = curr->next;
437+
n_tail->next = curr->next;
403438
curr->next = new_node;
439+
if(curr == tail){
440+
tail = n_tail;
441+
}
404442
}
405443
void insert_after(const Iterator iter_position,Iterator listBegin,const Iterator listEnd){
406444
Node* curr = iter_position.get_raw();
407445
Node* new_head = listBegin.get_raw();
408446
Node* end = listEnd.get_raw();
409447
Node* new_node = new Node(new_head->data);
410448
size++;
411-
Node* tail = new_node;
449+
Node* n_tail = new_node;
412450
new_head = new_head->next;
413451
while(new_head != end){
414452
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;
417455
new_head = new_head->next;
418456
size++;
419457
}
420-
tail->next = curr->next;
458+
n_tail->next = curr->next;
421459
curr->next = new_node;
460+
if(curr == tail){
461+
tail = new_node;
462+
}
422463
}
423464
public://overload erase after
424465
void erase_after(const Iterator iter_position){
425466
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;
428480
}
429-
Node* temp = curr->next;
430-
curr->next = temp->next;
431-
size--;
432-
delete temp;
433481
}
434482
void erase_after(const Iterator pos_begin,const Iterator pos_end){
435483
Node* first = pos_begin.get_raw();
484+
Node* fst = pos_begin.get_raw();
436485
Node* curr = first->next;
437486
Node* last = pos_end.get_raw();
438487
// curr = curr->next;
439488
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+
}
444501
}
445502
first->next = last;
503+
if(last == nullptr){
504+
tail = first;
505+
}
446506
}
507+
447508
public: //reverse method
448509
void reverse(){
449510
Node* prev = nullptr;

0 commit comments

Comments
 (0)