题目
代码
头文件leetcode.h
#include <stdbool.h>
#define MAX(a,b) ((a)>(b) ? (a) : (b))
typedef struct tagListNode{
int val;
struct tagListNode *next;
} MyListNode;
typedef struct {
MyListNode *head;
int size;
} MyLinkedList;
#ifdef __cplusplus
extern "C" {
#endif
MyLinkedList* myLinkedListCreate();
int myLinkedListGet(MyLinkedList* obj, int index);
void myLinkedListAddAtHead(MyLinkedList* obj, int val);
void myLinkedListAddAtTail(MyLinkedList* obj, int val);
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val);
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index);
void myLinkedListFree(MyLinkedList* obj);
#ifdef __cplusplus
}
#endif
源文件leetcode.c
#include <stdio.h>
#include "leetcode.h"
#include "string.h"
MyListNode *NodeCreate(int val)
{
MyListNode *node = malloc(sizeof(MyListNode));
node->val = val;
node->next = NULL;
return node;
}
MyLinkedList* myLinkedListCreate()
{
MyLinkedList *obj = malloc(sizeof(MyLinkedList));
obj->head = NodeCreate(0);
obj->size = 0;
return obj;
}
int myLinkedListGet(MyLinkedList* obj, int index)
{
if (index < 0 || index >= obj->size) {
return -1;
}
MyListNode *cur = obj->head;
for (int i = 0; i <= index; i++) {
cur = cur->next;
}
return cur->val;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val)
{
if (index > obj->size) {
return;
}
index = MAX(0, index);
obj->size++;
MyListNode *cur = obj->head;
for (int i = 0; i < index; i++) {
cur = cur->next;
}
MyListNode *tmp = NodeCreate(val);
tmp->next = cur->next;
cur->next = tmp;
}
void myLinkedListAddAtHead(MyLinkedList* obj, int val)
{
myLinkedListAddAtIndex(obj, 0, val);
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val)
{
myLinkedListAddAtIndex(obj, obj->size, val);
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index)
{
if (index < 0 || index >= obj->size) {
return;
}
obj->size--;
MyListNode *cur = obj->head;
for (int i = 0; i < index; i++) {
cur = cur->next;
}
MyListNode *toDelete = cur->next;
cur->next = toDelete->next;
free(toDelete);
}
void myLinkedListFree(MyLinkedList* obj)
{
MyListNode *cur = obj->head;
MyListNode *tmp = NULL;
while (cur) {
tmp = cur;
cur = cur->next;
free(tmp);
}
free(obj);
}