improve linked list insert and merge from O(n) to O(1)
just keeping track of the tail is enough to do that
This commit is contained in:
parent
26f425b811
commit
e07bb4eee0
2 changed files with 8 additions and 20 deletions
|
@ -13,6 +13,7 @@ typedef struct {
|
||||||
size_t length;
|
size_t length;
|
||||||
size_t element_size;
|
size_t element_size;
|
||||||
Node *head;
|
Node *head;
|
||||||
|
Node *tail;
|
||||||
} LinkedList;
|
} LinkedList;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -16,6 +16,7 @@ LinkedList linked_list_new(size_t element_size) {
|
||||||
ret.length = 0;
|
ret.length = 0;
|
||||||
ret.element_size = element_size;
|
ret.element_size = element_size;
|
||||||
ret.head = NULL;
|
ret.head = NULL;
|
||||||
|
ret.tail = NULL;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -24,17 +25,14 @@ void linked_list_insert(LinkedList *l, void *value) {
|
||||||
if (l->head == NULL) {
|
if (l->head == NULL) {
|
||||||
l->head = node_new(value, l->element_size);
|
l->head = node_new(value, l->element_size);
|
||||||
l->head->next = l->head;
|
l->head->next = l->head;
|
||||||
|
l->tail = l->head;
|
||||||
l->length += 1;
|
l->length += 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node *tail = l->head;
|
l->tail->next = node_new(value, l->element_size);
|
||||||
while (tail->next != l->head) {
|
l->tail->next->next = l->head;
|
||||||
tail = tail->next;
|
l->tail = l->tail->next;
|
||||||
}
|
|
||||||
|
|
||||||
tail->next = node_new(value, l->element_size);
|
|
||||||
tail->next->next = l->head;
|
|
||||||
l->length += 1;
|
l->length += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,19 +40,8 @@ LinkedList linked_list_merge(LinkedList l1, LinkedList l2) {
|
||||||
if (l1.head == NULL) return l2;
|
if (l1.head == NULL) return l2;
|
||||||
if (l2.head == NULL) return l1;
|
if (l2.head == NULL) return l1;
|
||||||
|
|
||||||
Node *l1_tail = l1.head;
|
l1.tail->next = l2.head;
|
||||||
while (l1_tail->next != l1.head) {
|
l2.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.length += l2.length;
|
l1.length += l2.length;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue