链表——设计链表

题目 707. 设计链表

传送门

typedef struct {
    int val;
    struct MyLinkedList* next;
} MyLinkedList;


MyLinkedList* myLinkedListCreate() {
    MyLinkedList* head = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    head->next = NULL;
    return head;
}

int myLinkedListGet(MyLinkedList* obj, int index) {
    MyLinkedList* cur = obj->next;
    for (int i = 0; cur != NULL; ++i) {
        if (i == index) {
            return cur->val;
        } else {
            cur = cur->next;
        }
    }
    return -1;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    MyLinkedList *new_node = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    new_node->val = val;
    new_node->next = obj->next;
    obj->next = new_node;
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    MyLinkedList *cur = obj;
    while(cur->next != NULL) {
        cur = cur->next;
    }
    MyLinkedList *new_node = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    new_node->val = val;
    new_node->next = NULL;
    cur->next = new_node;
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    if (index == 0) {
        myLinkedListAddAtHead(obj, val);
        return ;
    }
    MyLinkedList* cur = obj->next;
    for (int i = 1; cur != NULL; ++i) {
        if (i == index) {
            MyLinkedList* new_node = (MyLinkedList *)malloc(sizeof(MyLinkedList));
            new_node->val = val;
            new_node->next = cur->next;
            cur->next = new_node;
            break;
        } else {
            cur = cur->next;
        }
    }
    return ;
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    if (index == 0) {
        MyLinkedList *tmp = obj->next; // 第0个点
        if (tmp != NULL) {
            obj->next = tmp->next;
            free(tmp);
        }
        return ;
    }
    MyLinkedList* cur = obj->next;  // 从第0个节点遍历,序号从1开始,方便删除
    for (int i = 1; cur != NULL && cur->next != NULL; ++i) {
        if (i == index) {   // 相当于到了第 index-1 这个结点
            MyLinkedList* tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList));
            tmp = cur->next; // tmp是要删除的结点
            cur->next = tmp->next;
            free(tmp);
            return ;
        } else {
            cur = cur->next;
        }
    }
}

void myLinkedListFree(MyLinkedList* obj) {
    while (obj != NULL) {
        MyLinkedList *tmp = obj;
        obj = obj->next;
        free(tmp);
    }
}

/**
 * Your MyLinkedList struct will be instantiated and called as such:
 * MyLinkedList* obj = myLinkedListCreate();
 * int param_1 = myLinkedListGet(obj, index);
 
 * myLinkedListAddAtHead(obj, val);
 
 * myLinkedListAddAtTail(obj, val);
 
 * myLinkedListAddAtIndex(obj, index, val);
 
 * myLinkedListDeleteAtIndex(obj, index);
 
 * myLinkedListFree(obj);
*/
posted @ 2022-09-08 08:02  番茄元  阅读(28)  评论(0)    收藏  举报