Skip to content

Commit 36960d6

Browse files
authored
Create 0707-design-linked-list.c
1 parent bdafa23 commit 36960d6

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed

c/0707-design-linked-list.c

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
typedef struct Node {
2+
struct Node* next;
3+
struct Node* prev;
4+
int val;
5+
} Node;
6+
7+
typedef struct {
8+
Node* head;
9+
Node* tail;
10+
int length;
11+
} MyLinkedList;
12+
13+
Node* createNode(int val) {
14+
Node* new_node = (Node*)malloc(sizeof(Node) );
15+
new_node->next = NULL;
16+
new_node->prev = NULL;
17+
new_node->val = val;
18+
return new_node;
19+
}
20+
21+
MyLinkedList* myLinkedListCreate() {
22+
MyLinkedList* list = (MyLinkedList*)malloc(sizeof(MyLinkedList) );
23+
list->head = createNode(-1);
24+
list->tail = list->head;
25+
list->length = 0;
26+
return list;
27+
}
28+
29+
Node* traverseList(MyLinkedList* obj, int index) {
30+
if (index < 0 || index >= obj->length)
31+
return NULL;
32+
Node* trev = obj->head;
33+
while (index >= 0) {
34+
trev = trev->next;
35+
index -= 1;
36+
}
37+
return trev;
38+
}
39+
40+
int myLinkedListGet(MyLinkedList* obj, int index) {
41+
Node *node = traverseList(obj, index);
42+
if (node != NULL)
43+
return node->val;
44+
return -1;
45+
}
46+
47+
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
48+
Node* new_node = createNode(val);
49+
new_node->next = obj->head->next;
50+
new_node->prev = obj->head;
51+
obj->head->next = new_node;
52+
if (new_node->next != NULL)
53+
new_node->next->prev = new_node;
54+
else
55+
obj->tail = new_node;
56+
obj->length += 1;
57+
return;
58+
}
59+
60+
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
61+
Node* new_node = createNode(val);
62+
obj->tail->next = new_node;
63+
new_node->prev = obj->tail;
64+
obj->tail = obj->tail->next;
65+
obj->length += 1;
66+
return;
67+
}
68+
69+
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
70+
if (index == 0) {
71+
myLinkedListAddAtHead(obj, val);
72+
return;
73+
}
74+
else if (index == obj->length) {
75+
myLinkedListAddAtTail(obj, val);
76+
return;
77+
}
78+
Node* prev_node = traverseList(obj, index - 1);
79+
if (prev_node == NULL)
80+
return;
81+
Node* new_node = createNode(val);
82+
new_node->next = prev_node->next;
83+
new_node->prev = prev_node;
84+
prev_node->next = new_node;
85+
if (new_node->next != NULL)
86+
new_node->next->prev = new_node;
87+
obj->length += 1;
88+
return;
89+
}
90+
91+
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
92+
Node *node = traverseList(obj, index);
93+
if (node == NULL)
94+
return;
95+
Node *temp = node;
96+
node->prev->next = node->next;
97+
if (node->next != NULL)
98+
node->next->prev = node->prev;
99+
else
100+
obj->tail = node->prev;
101+
obj->length -= 1;
102+
free(temp);
103+
return;
104+
}
105+
106+
void myLinkedListFree(MyLinkedList* obj) {
107+
Node *prev = NULL, *cur = obj->head;
108+
while (cur != NULL) {
109+
prev = cur;
110+
cur = cur->next;
111+
free(prev);
112+
}
113+
free(obj);
114+
}
115+
116+
/**
117+
* Your MyLinkedList struct will be instantiated and called as such:
118+
* MyLinkedList* obj = myLinkedListCreate();
119+
* int param_1 = myLinkedListGet(obj, index);
120+
121+
* myLinkedListAddAtHead(obj, val);
122+
123+
* myLinkedListAddAtTail(obj, val);
124+
125+
* myLinkedListAddAtIndex(obj, index, val);
126+
127+
* myLinkedListDeleteAtIndex(obj, index);
128+
129+
* myLinkedListFree(obj);
130+
*/

0 commit comments

Comments
 (0)