diff --git a/include/list.h b/include/list.h new file mode 100644 index 0000000..6f09b6f --- /dev/null +++ b/include/list.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include + +/** Linked list data structure + */ + +struct ListNode { + int val; + struct ListNode *next; +}; + +struct ListNode *list_create(int val) { + struct ListNode *node = malloc(sizeof(struct ListNode)); + node->next = NULL; + node->val = val; + return node; +} + +struct ListNode *list_insert(struct ListNode *list, int val) { + if (list == NULL) { + list = list_create(val); + return list; + } else { + struct ListNode *tail = list_create(val); + struct ListNode *current = list; + while (current->next != NULL) { + current = current->next; + } + current->next = tail; + return list; + } +} + +void list_clear(struct ListNode *list) { + struct ListNode *current = list; + if (current == NULL) { + return; + } + while (current->next != NULL) { + struct ListNode *next = current->next; + free(current); + current = next; + } +} + +void list_print(struct ListNode *list) { + struct ListNode *current = list; + printf("list: "); + while (current != NULL) { + printf("%d->", current->val); + current = current->next; + } + printf("\n"); +} diff --git a/src/19.remove-nth-node-from-end-of-list.c b/src/19.remove-nth-node-from-end-of-list.c new file mode 100644 index 0000000..25ad883 --- /dev/null +++ b/src/19.remove-nth-node-from-end-of-list.c @@ -0,0 +1,82 @@ +#include "../include/list.h" + + +/** Remove n-th element from linked list */ +struct ListNode *removeNthElement(struct ListNode *head, int n) { + int i=0; + if (n < 0) { + return head; + } + if (n == 0) { + return head->next; + } + struct ListNode *current = head; + while (i < n - 1 && current != NULL) { + current = current->next; + i++; + } + if (current != NULL && current->next != NULL && current->next->next != NULL) { + struct ListNode *to_remove = current->next; + current->next = current->next->next; + free(to_remove); + } else if (current != NULL && current->next != NULL) { + free(current->next); + current->next = NULL; + } + return head; +} + +/** Length of a linked list */ +unsigned int list_length(struct ListNode *head) { + unsigned int length = 0; + struct ListNode *current = head; + while (current != NULL) { + current = current->next; + length++; + } + return length; +} + +struct ListNode *removeNthFromEnd(struct ListNode *head, int n) { + if (n < 0) { + return head; + } + unsigned int length = list_length(head); + return removeNthElement(head, length - n); +} + + +void test_1() { + struct ListNode *l = NULL; + l = list_insert(l, 1); + l = list_insert(l, 2); + l = list_insert(l, 3); + l = list_insert(l, 4); + l = list_insert(l, 5); + struct ListNode *result_list = removeNthFromEnd(l, 2); + list_print(result_list); + list_clear(result_list); +} + +void test_2() { + struct ListNode *l = NULL; + l = list_insert(l, 1); + struct ListNode *result_list = removeNthFromEnd(l, 1); + list_print(result_list); + list_clear(result_list); +} + +void test_3() { + struct ListNode *l = NULL; + l = list_insert(l, 1); + l = list_insert(l, 2); + struct ListNode *result_list = removeNthFromEnd(l, 1); + list_print(result_list); + list_clear(result_list); +} + +int main() { + test_1(); + test_2(); + test_3(); +}