diff options
author | Jack Sangdahl <[email protected]> | 2025-01-14 12:47:05 -0700 |
---|---|---|
committer | Jack Sangdahl <[email protected]> | 2025-01-14 12:47:05 -0700 |
commit | 739d4b1bff93a46887828a958d85c4a0a0bd6c71 (patch) | |
tree | da4a2f3cb967afd1e5de4d679b2a4a2e52848cb7 /design_linked_list.c | |
parent | b4e04c3e1da4d6ab0b439b71622a32d61fb25c9d (diff) | |
download | leetcode-739d4b1bff93a46887828a958d85c4a0a0bd6c71.tar.gz leetcode-739d4b1bff93a46887828a958d85c4a0a0bd6c71.zip |
707. design linked list
Diffstat (limited to 'design_linked_list.c')
-rw-r--r-- | design_linked_list.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/design_linked_list.c b/design_linked_list.c new file mode 100644 index 0000000..f1e78be --- /dev/null +++ b/design_linked_list.c @@ -0,0 +1,103 @@ +// 707. Design Linked List +#include "leetcode.h" + +/* + * design your implementation of the linked list. you can choose to use a singly + * or doubly linked list. a node in a singly linked list should have two + * attributes: 'val' and 'next'. 'val' is the value of the current node, and + * 'next' is a pointing/reference to the next code. if you want to use the + * doubly linked list, you will need one more attribute 'prev' to indicate the + * previous node in the linked list. assume all nodes in the linked list are + * 0-indexed to indicate the previous node in the linked list. assume all nodes + * in the linked list are 0-indexed. + */ + +typedef struct List { + int val; + struct List *next; +} MyLinkedList; + +MyLinkedList *myLinkedListCreate() { + MyLinkedList *obj = (MyLinkedList *)malloc(sizeof(MyLinkedList)); + obj->val = -1; + obj->next = NULL; + return obj; +} + +int myLinkedListGet(MyLinkedList *obj, int index) { + obj = obj->next; + int cnt = 0; + while (obj) { + if (cnt == index) + return obj->val; + cnt++; + obj = obj->next; + } + return -1; +} + +void myLinkedListAddAtHead(MyLinkedList *obj, int val) { + MyLinkedList *tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList)); + tmp->val = val; + tmp->next = obj->next; + obj->next = tmp; +} + +void myLinkedListAddAtTail(MyLinkedList *obj, int val) { + while (obj && obj->next) + obj = obj->next; + MyLinkedList *tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList)); + tmp->val = val; + tmp->next = NULL; + obj->next = tmp; +} + +void myLinkedListAddAtIndex(MyLinkedList *obj, int index, int val) { + int cnt = 0; + MyLinkedList *tmp = obj; + while (tmp) { + if (cnt == index) { + MyLinkedList *curr = (MyLinkedList *)malloc(sizeof(MyLinkedList)); + curr->val = val; + curr->next = tmp->next; + tmp->next = curr; + break; + } + cnt++; + tmp = tmp->next; + } +} + +void myLinkedListDeleteAtIndex(MyLinkedList *obj, int index) { + int cnt = 0; + MyLinkedList *curr = obj->next, *pre = obj; + while (curr) { + if (cnt == index) { + pre->next = curr->next; + free(curr); + return; + } + cnt++; + pre = curr; + curr = curr->next; + } +} + +void myLinkedListFree(MyLinkedList *obj) { + while (obj) { + MyLinkedList *tmp = obj; + obj = obj->next; + free(tmp); + } +} + +int main() { + MyLinkedList *obj = myLinkedListCreate(); + myLinkedListAddAtHead(obj, 1); + myLinkedListAddAtTail(obj, 3); + myLinkedListAddAtIndex(obj, 1, 2); + printf("%d\n", myLinkedListGet(obj, 1)); // expect: 2 + myLinkedListDeleteAtIndex(obj, 1); + printf("%d\n", myLinkedListGet(obj, 1)); // expect: 3 + myLinkedListFree(obj); +} |