From e07bb4eee0330057b9254bc8deab7611ca471bc3 Mon Sep 17 00:00:00 2001 From: jacekpoz Date: Mon, 11 Mar 2024 12:01:09 +0100 Subject: [PATCH] improve linked list insert and merge from O(n) to O(1) just keeping track of the tail is enough to do that --- lab01/zad2/include/linked_list.h | 1 + lab01/zad2/src/linked_list.c | 27 +++++++-------------------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/lab01/zad2/include/linked_list.h b/lab01/zad2/include/linked_list.h index 54e3a1b..0531aab 100644 --- a/lab01/zad2/include/linked_list.h +++ b/lab01/zad2/include/linked_list.h @@ -13,6 +13,7 @@ typedef struct { size_t length; size_t element_size; Node *head; + Node *tail; } LinkedList; typedef struct { diff --git a/lab01/zad2/src/linked_list.c b/lab01/zad2/src/linked_list.c index 755fe31..317004e 100644 --- a/lab01/zad2/src/linked_list.c +++ b/lab01/zad2/src/linked_list.c @@ -16,6 +16,7 @@ LinkedList linked_list_new(size_t element_size) { ret.length = 0; ret.element_size = element_size; ret.head = NULL; + ret.tail = NULL; return ret; } @@ -24,17 +25,14 @@ void linked_list_insert(LinkedList *l, void *value) { if (l->head == NULL) { l->head = node_new(value, l->element_size); l->head->next = l->head; + l->tail = l->head; l->length += 1; return; } - Node *tail = l->head; - while (tail->next != l->head) { - tail = tail->next; - } - - tail->next = node_new(value, l->element_size); - tail->next->next = l->head; + l->tail->next = node_new(value, l->element_size); + l->tail->next->next = l->head; + l->tail = l->tail->next; l->length += 1; } @@ -42,19 +40,8 @@ LinkedList linked_list_merge(LinkedList l1, LinkedList l2) { if (l1.head == NULL) return l2; if (l2.head == NULL) return l1; - Node *l1_tail = l1.head; - while (l1_tail->next != l1.head) { - l1_tail = l1_tail->next; - } - - l1_tail->next = l2.head; - - Node *l2_tail = l2.head; - while (l2_tail->next != l2.head) { - l2_tail = l2_tail->next; - } - - l2_tail->next = l1.head; + l1.tail->next = l2.head; + l2.tail->next = l1.head; l1.length += l2.length;