单链表的增删改查

LC-707 单链表的增删改查操作:

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

//创建头节点
MyLinkedList* myLinkedListCreate() {
    MyLinkedList* head =(MyLinkedList *)malloc(sizeof(MyLinkedList));
    head->next=NULL;
    return head;
}

//获取链表第index个节点的数值,如果索引无效,则返回-1
int myLinkedListGet(MyLinkedList* obj, int index) {
    MyLinkedList *p=obj->next;
    for(int i=0;p!=NULL;i++){
        if(i==index)
        return p->val;
        else
        p=p->next;
    }
    return -1;
}

//在链表的最前面插入一个节点
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    MyLinkedList *p=(MyLinkedList *)malloc(sizeof(MyLinkedList));
    p->val=val;
    p->next=obj->next;
    obj->next=p;
}

//在链表的最后面插入一个节点
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    MyLinkedList *h=obj;
    while(h->next!=NULL)
       { 
           h=h->next;
       }
    MyLinkedList *p=(MyLinkedList *)malloc(sizeof(MyLinkedList));
    p->val=val;
    p->next=NULL;
    h->next=p;
}
//在链表第index个节点前面插入一个节点。如果index 等于链表的长度,则加到链表末尾;index 大于链表长度,则插入;index小于0,则在头部插入。
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    if(index<=0){
        myLinkedListAddAtHead(obj,val);
        return;
    }
    MyLinkedList *p=(MyLinkedList *)malloc(sizeof(MyLinkedList));
    MyLinkedList *h=obj->next;
    for(int i=1;h!=NULL;i++){
        if(i==index){
            p->val=val;
            p->next=h->next;
            h->next=p;
            return;
        }
        else
        h=h->next;
    }

}

//如果索引 index 有效,则删除链表中的第 index 个节点。
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    if(index==0){
        MyLinkedList *p=obj->next;
        if(p!=NULL)
        {
            obj->next=p->next;
            free(p);
        }
        return;
    }
    MyLinkedList *q=obj->next;
    for(int i=1;q!=NULL&&q->next!=NULL;i++){
        if(i==index){
            MyLinkedList *t=q->next;
            if(t!=NULL){
            q->next=t->next;
            free(t);
            }
            return;
        }
        else
        q=q->next;
    }
}

//删除链表所有元素
void myLinkedListFree(MyLinkedList* obj) {
    while(obj!=NULL){
        MyLinkedList *p=obj;
        obj=obj->next;
        free(p);
    }
}
posted @ 2022-03-18 18:19  贝贝子  阅读(34)  评论(0编辑  收藏  举报