代码随想录算法训练营Day3|203.移除链表元素 707.设计链表 206.反转链表

67 阅读2分钟

代码随想录算法训练营Day3|203.移除链表元素 707.设计链表 206.反转链表

203.移除链表元素

/// 移除链表元素
/// - Parameters:
///   - head: 首结点指针
///   - val: 要移除的元素值
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* preHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    preHead->next = head;
    struct ListNode* p = preHead;                           //自定义一个假想的头结点
    struct ListNode* q = head;
    while (q) {
        if(q->val == val){                                  //
            q = q->next;
            p->next = q;
            p = p->next;
        }else{
            p = p->next;
            q = q->next;
        }
    }
    return preHead->next;
}

image-20240102230354111

707.设计链表

struct ListNode *listNodeCreat(int val) {
    struct ListNode * node = (struct ListNode *)malloc(sizeof(struct ListNode));
    node->val = val;
    node->next = NULL;
    return node;
}

MyLinkedList* myLinkedListCreate() {
    MyLinkedList* list = (MyLinkedList*)malloc(sizeof(MyLinkedList));
    struct ListNode* head = listNodeCreat(0);
    list->head = head;
    list->length = 0;
    return list;
}

int myLinkedListGet(MyLinkedList* obj, int index) {
    if(index >= obj->length || index < 0){
        return -1;
    }
    struct ListNode* p = obj->head;
    for (int i = 0; i <= index; i++) {
        p = p->next;
    }
    return p->val;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    myLinkedListAddAtIndex(obj, 0, val);
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    myLinkedListAddAtIndex(obj, obj->length, val);
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    if(index > obj->length || index < 0){
        return;
    }
    struct ListNode* pre = obj->head;
    struct ListNode* cur = obj->head->next;
    for (int i = 0; i < index; i++) {
        pre = pre->next;
        cur = cur->next;
    }
    struct ListNode* newNode = listNodeCreat(val);
    newNode->next = cur;
    pre->next = newNode;
    obj->length++;
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    if(index >= obj->length || index < 0){
        return;
    }
    struct ListNode* pre = obj->head;
    struct ListNode* cur = obj->head->next;
    for (int i = 0; i < index; i++) {
        pre = pre->next;
        cur = cur->next;
    }
    pre->next = cur->next;
    free(cur);
    obj->length--;
}

void myLinkedListFree(MyLinkedList* obj) {
    struct ListNode* p = obj->head;
    struct ListNode* temp = obj->head;
    while (p) {
        temp = p;
        p = p->next;
        free(temp);
    }
    free(obj);
}

image-20240102232350306

206.反转链表

struct ListNode* reverseList(struct ListNode* head) {
    //遍历指针p
    struct ListNode* p = head;
    //上一次插入之后的链表头指针,初始为NULL
    struct ListNode* last = NULL;
    while (p) {
        // 保存当前节点的next,下一轮处理要继续用
        struct ListNode* next = p->next;
        // 当前节点的next指向上一次插入之后的链表头指针,实现反向连接
        p->next = last;
        // p成为新头结点
        last = p;
        // 继续遍历
        p = next;
    }
    return last;
}

image-20240102234602668