LeetCode707设计链表

发布于:2025-03-23 ⋅ 阅读:(28) ⋅ 点赞:(0)

在这里插入图片描述
思路:主要是确定,虚拟头节点不算个数,从第一个正式节点开始计数,下标从0开始,这个确定了就写就完了

typedef struct Node // 定义节点
{
    int val;
    struct Node* next;
} Node;

typedef struct MyLinkedList // 定义链表
{
    int size;    // 链表中节点的数量
    Node* head;  // 指向链表头结点的指针
} MyLinkedList;

// 初始化 MyLinkedList
MyLinkedList* myLinkedListCreate() 
{
    MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList)); // 定义一个空链表
    Node* dummyhead = (Node*)malloc(sizeof(Node)); // 定义一个空节点
    dummyhead->next = NULL;
    obj->head = dummyhead; // 头结点指向空节点
    obj->size = 0; // 设置链表节点数量为 0
    return obj;
}

// 获取链表中下标为 index 的节点的值
int myLinkedListGet(MyLinkedList* obj, int index) 
{
    if (index < 0 || index >= obj->size) // 索引超出范围
        return -1;

    Node* cur = obj->head->next; // 从头结点的下一个节点开始
    while (index--)
    {
        cur = cur->next;
    }
    return cur->val;
}

// 在头部插入节点
void myLinkedListAddAtHead(MyLinkedList* obj, int val) 
{
    Node* newNode = (Node*)malloc(sizeof(Node)); // 分配新节点
    newNode->val = val;
    newNode->next = obj->head->next; // 新节点指向原头节点
    obj->head->next = newNode; // 头节点指向新节点
    obj->size++; // 更新链表大小
}

// 在尾部插入节点
void myLinkedListAddAtTail(MyLinkedList* obj, int val) 
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->val = val;
    newNode->next = NULL;

    Node* cur = obj->head;
    while (cur->next != NULL) 
    {
        cur = cur->next;
    }
    cur->next = newNode;
    obj->size++;
}

// 在指定位置插入节点
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) 
{
    if (index < 0 || index > obj->size) // 插入位置超出范围
        return;

    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->val = val;

    Node* cur = obj->head;
    while (index--)
    {
        cur = cur->next;
    }

    newNode->next = cur->next;
    cur->next = newNode;
    obj->size++;
}

// 删除指定位置节点
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) 
{
    if (index < 0 || index >= obj->size) // 索引超出范围
        return;

    Node* cur = obj->head;
    while (index--)
    {
        cur = cur->next;
    }

    Node* toDelete = cur->next;
    cur->next = toDelete->next;
    free(toDelete);
    obj->size--;
}

// 释放链表
void myLinkedListFree(MyLinkedList* obj) 
{
    Node* cur = obj->head;
    while (cur != NULL) 
    {
        Node* next = cur->next;
        free(cur);
        cur = next;
    }
    free(obj);
}



网站公告

今日签到

点亮在社区的每一天
去签到