当前位置: 首页 > article >正文

LeetCode707设计链表

在这里插入图片描述
思路:主要是确定,虚拟头节点不算个数,从第一个正式节点开始计数,下标从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);
}



http://www.kler.cn/a/596780.html

相关文章:

  • 四台电脑共享外设的终极方案:USB3.0 共享切换器 SV04 深度解析
  • PyCharm中使用pip安装PyTorch(从0开始仅需两步)
  • 连通图(并查集)
  • C# WebForm显示bootstrap模态对话框
  • 中颖SH366000介绍和使用全解
  • [01-04-02].第20节:PyQt5库初识及实现简易计算器
  • 数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记
  • css基础-浮动
  • 【工具变量】全国地级市克鲁格曼专业化指数数据集(2006-2023年)
  • 基于蒙特卡洛方法的网格世界求解
  • 使用netDxf扩充LaserGRBL使它支持Dxf文件格式
  • 在刀刃上发力:如何精准把握计划关键节点
  • uniapp 微信小程序 手机号快速验证组件 解密 encryptedData 获取手机号
  • docker速通
  • OAuth 2.0认证
  • doris:负载均衡
  • 【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】
  • OpenHarmony 开源硬件学习全指南:从入门到实战
  • JAVA - OJ沙箱(JAVA默认模板沙箱,JAVA操作dokcer沙箱)
  • MacOS安装 nextcloud 的 Virtual File System