LeetCode 707 题:设计链表

LeetCode 707 题:设计链表(Design Linked List)

题目描述

设计一个支持以下操作的链表实现:

  1. MyLinkedList(): 设计并初始化一个空链表。
  2. get(index): 获取链表中第 index 个节点的值。如果索引无效,则返回 -1。
  3. addAtHead(val): 在链表的第一个元素前添加一个值为 val 的节点。
  4. addAtTail(val): 在链表的最后一个元素后添加一个值为 val 的节点。
  5. addAtIndex(index, val): 在链表的第 index 个节点之前添加值为 val 的节点。如果 index 大于链表的长度,则不会插入节点。
  6. deleteAtIndex(index): 删除链表中第 index 个节点,如果索引无效,则不删除节点。

解题思路

我们可以使用链表来实现这些功能,链表的基本操作包括:在头部插入、尾部插入、按索引插入、删除元素。为了高效实现这些操作,我们需要:

  1. addAtHead()addAtTail() 都是常数时间操作。
  2. addAtIndex()deleteAtIndex() 需要通过遍历链表找到指定的位置,因此它们的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是链表的长度。

我们使用虚拟头节点来简化边界条件的处理。


代码实现与逐行详解

#include <stdio.h>
#include <stdlib.h>// 链表节点结构
struct ListNode {int val;struct ListNode *next;
};// 链表类
struct MyLinkedList {struct ListNode *head;
};// 创建一个新节点
struct ListNode* createNode(int val) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));newNode->val = val;newNode->next = NULL;return newNode;
}// 初始化链表
struct MyLinkedList* myLinkedListCreate() {struct MyLinkedList* obj = (struct MyLinkedList*)malloc(sizeof(struct MyLinkedList));obj->head = createNode(0);  // 创建一个虚拟头节点,简化操作return obj;
}// 获取链表第 index 个节点的值
int myLinkedListGet(struct MyLinkedList* obj, int index) {struct ListNode* current = obj->head->next;  // 从虚拟头节点的下一个开始for (int i = 0; i < index && current != NULL; i++) {current = current->next;}return (current == NULL) ? -1 : current->val;
}// 在链表头部添加一个值为 val 的节点
void myLinkedListAddAtHead(struct MyLinkedList* obj, int val) {struct ListNode* newNode = createNode(val);newNode->next = obj->head->next;obj->head->next = newNode;
}// 在链表尾部添加一个值为 val 的节点
void myLinkedListAddAtTail(struct MyLinkedList* obj, int val) {struct ListNode* newNode = createNode(val);struct ListNode* current = obj->head;while (current->next != NULL) {current = current->next;}current->next = newNode;
}// 在链表第 index 个位置之前添加一个值为 val 的节点
void myLinkedListAddAtIndex(struct MyLinkedList* obj, int index, int val) {if (index < 0) return;struct ListNode* current = obj->head;for (int i = 0; i < index && current != NULL; i++) {current = current->next;}if (current == NULL) return;  // 如果当前节点为空,说明索引超出链表长度struct ListNode* newNode = createNode(val);newNode->next = current->next;current->next = newNode;
}// 删除链表第 index 个位置的节点
void myLinkedListDeleteAtIndex(struct MyLinkedList* obj, int index) {struct ListNode* current = obj->head;for (int i = 0; i < index && current != NULL; i++) {current = current->next;}if (current == NULL || current->next == NULL) return;  // 索引无效,或者没有需要删除的节点struct ListNode* toDelete = current->next;current->next = current->next->next;free(toDelete);
}// 释放链表
void myLinkedListFree(struct MyLinkedList* obj) {struct ListNode* current = obj->head;while (current != NULL) {struct ListNode* toDelete = current;current = current->next;free(toDelete);}free(obj);
}// 打印链表
void printList(struct MyLinkedList* obj) {struct ListNode* current = obj->head->next;while (current != NULL) {printf("%d -> ", current->val);current = current->next;}printf("NULL\n");
}

代码逐行详解

1. 链表节点结构体定义
struct ListNode {int val;struct ListNode *next;
};
  • 链表节点定义:定义了一个链表节点 ListNode,包含两个成员:
    • val:节点的值。
    • next:指向下一个节点的指针。
2. 创建新节点函数
struct ListNode* createNode(int val) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));newNode->val = val;newNode->next = NULL;return newNode;
}
  • 创建节点:通过 malloc 动态分配内存,创建一个新的节点,并初始化节点的值和 next 指针。
3. MyLinkedList 结构体与初始化
struct MyLinkedList* myLinkedListCreate() {struct MyLinkedList* obj = (struct MyLinkedList*)malloc(sizeof(struct MyLinkedList));obj->head = createNode(0);  // 创建一个虚拟头节点,简化操作return obj;
}
  • 初始化链表:创建一个 MyLinkedList 对象,并为其分配内存。为了简化链表操作,创建了一个虚拟头节点 head,初始值为 0。
4. 获取链表第 index 个节点的值
int myLinkedListGet(struct MyLinkedList* obj, int index) {struct ListNode* current = obj->head->next;for (int i = 0; i < index && current != NULL; i++) {current = current->next;}return (current == NULL) ? -1 : current->val;
}
  • 获取节点值:从链表头节点开始,遍历到第 index 个节点。如果找到了该节点,则返回其值;否则返回 -1
5. 在链表头部添加节点
void myLinkedListAddAtHead(struct MyLinkedList* obj, int val) {struct ListNode* newNode = createNode(val);newNode->next = obj->head->next;obj->head->next = newNode;
}
  • 在头部插入节点:创建一个新节点并将其插入到链表的头部。更新虚拟头节点 headnext 指针指向新节点。
6. 在链表尾部添加节点
void myLinkedListAddAtTail(struct MyLinkedList* obj, int val) {struct ListNode* newNode = createNode(val);struct ListNode* current = obj->head;while (current->next != NULL) {current = current->next;}current->next = newNode;
}
  • 在尾部插入节点:遍历链表直到找到最后一个节点,将新节点插入到该节点的 next 指针位置。
7. 在指定索引处添加节点
void myLinkedListAddAtIndex(struct MyLinkedList* obj, int index, int val) {if (index < 0) return;struct ListNode* current = obj->head;for (int i = 0; i < index && current != NULL; i++) {current = current->next;}if (current == NULL) return;struct ListNode* newNode = createNode(val);newNode->next = current->next;current->next = newNode;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3670.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…

使用Pydantic驾驭大模型

本文介绍Pydantic 库&#xff0c;首先介绍其概念及优势&#xff0c;然后通过基本示例展示如何进行数据验证。后面通过多个示例解释如何在LangChain中通过Pydantic进行数据验证&#xff0c;保证与大模型进行交互过程中数据准确性&#xff0c;并显示清晰的数验证错误信息。 Pydan…

物联网网关Web服务器--Boa服务器移植与测试

1、Boa服务器介绍 BOA 服务器是一个小巧高效的web服务器&#xff0c;是一个运行于unix或linux下的&#xff0c;支持CGI的、适合于嵌入式系统的单任务的http服务器&#xff0c;源代码开放、性能高。 Boa 嵌入式 web 服务器的官方网站是http://www.boa.org/。 特点 轻量级&#x…

Qt之文件系统操作和读写

Qt creator 6.80 MinGw 64bit 文本文件是指以纯文本格式存储的文件&#xff0c;如cpp和hpp文件。XML文件和JSON文件也是文本文件&#xff0c;只是使用了特定的标记符号定义文本的含义&#xff0c;读取这种文本文件需要先对内容解析再显示。 qt提供了两种读写文本文件的方法。…

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…

C语言进阶习题【1】指针和数组(3)——一维指针指向字符数组首元素地址

3.3 一维指针指向数组首元素地址&#xff0c;sizeof和strlen #include<string.h> int main() {char* p "abcdef"; //指针p指向字符串首地址printf("%d\n", sizeof(p));//p是一位指针&#xff0c;求指针的大小&#xff1a;4字节/32位机器 或 8字节…

Linux:磁盘分区

目录 文件 内容 属性 磁盘的物理结构​编辑 磁盘的存储结构 磁盘的逻辑结构 块 磁盘分区 文件 内容 属性 一个文件可以是被打开的文件&#xff0c;也可以是未被打开的文件 被打开的文件就是在内存中&#xff0c;未被打开的文件一般就是放在磁盘上的 为什么要放…

RV1126+FFMPEG推流项目(9)AI和AENC模块绑定,并且开启线程采集

前面两篇已经交代AI和AENC模块的配置&#xff0c;这篇就让这两个模块绑定起来&#xff0c;绑定的原因是&#xff0c;Aenc从Ai模块拿到采集的原始数据进行编码。 使用 RK_MPI_SYS_Bind 把 AI 节点和 AENC 进行绑定&#xff0c;其中 enModId 是模块 ID 号选择的是 RK_ID_AI、s32C…

LabVIEW时域近场天线测试

随着通信技术的飞速发展&#xff0c;特别是在5G及未来通信技术中&#xff0c;天线性能的测试需求日益增加。对于短脉冲天线和宽带天线的时域特性测试&#xff0c;传统的频域测试方法已无法满足其需求。时域测试方法在这些应用中具有明显优势&#xff0c;可以提供更快速和精准的…

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年&#xff0c;计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程&#xff1a; 萌芽期&#xff1a;&#xff08;1950-2005&#xff09; 1956年&#xff1a;计算机专家约翰麦卡锡首次提出“人工智能”概念&#xff0c;标志…

【逆境中绽放:万字回顾2024我在挑战中突破自我】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 一、引言二、个人成长与盘点情感与心理成长学习与技能提升其它荣誉 三、年度创作历程回顾创作内容概…

前端小案例——网页井字棋

前言&#xff1a;我们在学习完了HTML、CSS和JavaScript之后&#xff0c;就会想着使用这三个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——网页井字棋。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可…

FPGA车牌识别

基于FPGA的车牌识别主要包含以下几个步骤&#xff1a;图像采集、颜色空间转换、边缘检测、形态学处理&#xff08;腐蚀和膨胀&#xff09;、特征值提取、模板匹配、结果显示。先用matlab对原理进行仿真&#xff0c;后用vivado和modelsim进行设计和仿真。 一、1.图像采集采用ov…

java使用poi-tl自定义word模板导出

文章目录 概要整体架构流程创建word模板核心代码导出结果 概要 在软件开发领域&#xff0c;自定义Word模板的使用是导出格式化数据的一种常见做法。poi-tl&#xff08;Apache POI Template Language&#xff09;作为一款基于广受认可的Apache POI库的Word模板引擎&#xff0c;…

Java 视频处理:基于 MD5 校验秒传及 ffmpeg 切片合并的实现

本文介绍两种网络技术实现方法。一是 MD5 校验秒传&#xff0c;服务器端用数据库记上传文件 MD5 值及存储路径&#xff0c;Java 代码接收客户端 MD5 值并查询校验&#xff0c;返回状态码。二是用 ffmpeg 切片视频成 m3u8 上传&#xff0c;异步合并文件实现视频按需加载。 1. …

JEL分类号

JEL分类系统&#xff0c;是美国经济学会“经济文献杂志”(《经济文献杂志》)所创立的对经济学文献的主题分类系统&#xff0c;并被现代西方经济学界广泛采用。 该分类方法主要采用开头的一个英文字母与随后的两位阿拉伯数字一起对经济学各部类进行“辞书式”编码分类。 https:…

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…

【王树森搜索引擎技术】概要01:搜索引擎的基本概念

1. 基本名词 query&#xff1a;查询词SUG&#xff1a;搜索建议文档&#xff1a;搜索结果标签/筛选项 文档单列曝光 文档双列曝光 2. 曝光与点击 曝光&#xff1a;用户在搜索结果页上看到文档&#xff0c;就算曝光文档点击&#xff1a;在曝光后&#xff0c;用户点击文档&…

Vulnhub-Tr0ll靶机笔记

Tr0ll靶机笔记 概述 靶机地址&#xff1a;https://www.vulnhub.com/entry/tr0ll-1,100/ 这台靶机比较简单&#xff0c;包含ftp的渗透&#xff0c;pcap流量包的分析&#xff0c;常规的web渗透和系统内核提权。让我们开始吧 Hack it&#xff01; 一、nmap扫描 1、端口扫描 …

uniapp 微信小程序 editor 富文本编辑器

<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…