[C/C++] -- 链表

C/C++ 中链表是一种常见的数据结构,用于存储和组织数据。链表由节点(Node)组成,每个节点包含数据和指向下一个节点的指针。链表相对于数组的优势在于可以动态地分配内存,插入和删除操作效率高,但访问元素的随机性能较差。

1.简介

  • 链表节点结构定义

在 C/C++ 中定义链表节点的结构通常包含两部分:数据区域和指向下一个节点的指针

struct Node {int data;Node* next;
};
  • 创建链表

链表可以通过动态内存分配来创建。通过 new(C++)或 malloc(C)函数为每个节点分配内存,并通过指针串联节点形成链表。

Node* newNode(int data) {Node* node = new Node;node->data = data;node->next = nullptr;return node;
}// 创建链表头节点
Node* head = newNode(1);
head->next = newNode(2);
head->next->next = newNode(3);
  • 插入节点

链表可以通过动态内存分配来创建。通过 new(C++)或 malloc(C)函数为每个节点分配内存,并通过指针串联节点形成链表。

Node* newNode = newNode(0);
newNode->next = head;
head = newNode;
  • 删除节点

删除节点时,需要调整前一个节点的指针,使其跳过当前节点,指向当前节点的下一个节点,并释放当前节点的内存。

// 删除头节点
Node* temp = head;
head = head->next;
delete temp;// 删除中间或尾部节点
Node* prev = nullptr;
Node* curr = head;
while (curr != nullptr && curr->data != target) {prev = curr;curr = curr->next;
}
if (curr != nullptr) {prev->next = curr->next;delete curr;
}
  • 遍历链表

使用循环结构遍历链表中的所有节点,并访问节点的数据。

Node* temp = head;
while (temp != nullptr) {cout << temp->data << " ";temp = temp->next;
}
  • 查找节点

遍历链表查找特定值或条件的节点,可以实现搜索功能。

int target = 3;
Node* temp = head;
while (temp != nullptr && temp->data != target) {temp = temp->next;
}
if (temp != nullptr) {cout << "Node found with value " << target << endl;
} else {cout << "Node not found" << endl;
}
  • 双向链表

双向链表除了有指向下一个节点的指针外,还有指向前一个节点的指针,可以实现在链表两个方向上的遍历。

  • 循环链表

循环链表的最后一个节点指向头节点,形成一个闭环。可以实现循环遍历。

  • 内存管理

在使用链表时,需要注意内存管理,确保在删除节点时释放相应的内存,避免内存泄漏。

#include <iostream>
#include <cstdlib>int main() {// 分配内存int *ptr = (int*)malloc(sizeof(int));if (ptr == nullptr) {std::cout << "内存分配失败!" << std::endl;return 1;}*ptr = 42;std::cout << "指针中的值为: " << *ptr << std::endl;// 释放内存free(ptr);return 0;
}

2.示例

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
  • 递归法
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if(!head||!head->next){/*直到当前节点的下一个节点为空时返回当前节点由于5没有下一个节点了,所以此处返回节点5*/return head;}ListNode* newHead = reverseList(head->next);/*第一轮出栈,head为5,head.next为空,返回5第二轮出栈,head为4,head.next为5,执行head.next.next=head也就是5.next=4,把当前节点的子节点的子节点指向当前节点此时链表为1->2->3->4<->5,由于4与5互相指向,所以此处要断开4.next=null此时链表为1->2->3->4<-5返回节点5第三轮出栈,head为3,head.next为4,执行head.next.next=head也就是4.next=3,此时链表为1->2->3<->4<-5,由于3与4互相指向,所以此处要断开3.next=null此时链表为1->2->3<-4<-5返回节点5第四轮出栈,head为2,head.next为3,执行head.next.next=head也就是3.next=2,此时链表为1->2<->3<-4<-5,由于2与3互相指向,所以此处要断开2.next=null此时链表为1->2<-3<-4<-5返回节点5第五轮出栈,head为1,head.next为2,执行head.next.next=head也就是2.next=1,此时链表为1<->2<-3<-4<-5,由于1与2互相指向,所以此处要断开1.next=null此时链表为1<-2<-3<-4<-5返回节点5出栈完成,最终头节点5->4->3->2->1*/head->next->next = head;head->next = nullptr;return newHead;}
};

时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。

空间复杂度:O(n),其中 n是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n 层。

  • 迭代

class Solution {
public:/*3个指针,prev,curr,next,它们组成一个前中后关系,从链表的一头移向另一头,起始时 prev 为空,结束时 next 为空*/ListNode* reverseList(ListNode* head) {//过去为空,现在从头,未来不存ListNode* pre = nullptr;ListNode* cur = head;while(cur){ListNode* next = cur->next;//未来出于现在cur->next = pre;//现在指向过去pre = cur;//过去成为现在cur = next;//现在成为未来}return pre;}
};

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

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

相关文章

MacOS 电脑如何通过自带terminal终端连接PostgreSQL

1、安装Postgre SQL客户端工具 brew install postgresql 2、连接到PostgreSQL &#xff08;1&#xff09;创建远程连接 psql -h hostname -U username -d database 其中&#xff0c;hostname 是 PostgreSQL 服务器的主机名或 IP 地址&#xff0c;username 是您的 PostgreS…

机器学习 - 预测训练模型

接着上篇博客机器学习-训练模型做进一步说明。 There are three things to make predictions (also called performing inference) with a PyTorch model: Set the model in evaluation mode (model.eval())Make the predictions using the inference mode context manager (…

学点Java_Day6_基于Copyright和Actions On Save的IDEA自动更新文件最后编辑时间的方法研究(IDEA2021.2及以上)

0 版本要求 IDEA2021.2及以上&#xff0c;我用的IntelliJ IDEA 2023.2.4 1 操作 1.1 Copyright设置 ① CtrlAltS打开设置&#xff08;Settings&#xff09;→ Editor → Copyright   ② Copyright → Copyright Profiles → → 取名 → OK   ③ 复制下面内容到框里&am…

java多线程使用与踩坑

SpringBoot使用多线程简单方法&#xff1a;地址 线程安全查阅资料参考&#xff1a;地址 背景&#xff1a; 经过上述资料查看&#xff0c;我想写个方法&#xff08;依靠notify()唤醒&#xff0c;依靠wait()等待&#xff09;实现两个线程轮流打印。 实现&#xff1a; 1.线程池配…

[Qt学习笔记]Qt使用MFC编译生成dll库在无编程环境电脑出现无法加载dll的问题

目录 1、 问题介绍2、 问题分析3、 问题总结和思考 1、 问题介绍 在项目实践中&#xff0c;使用Qt调用了一个vs创建的dll库&#xff0c;在本机上编译和release后的exe可以加载对应的dll文件&#xff0c;将exe拷贝到有vs编程环境的电脑上也可以加载对应的dll文件&#xff0c;但…

Centos7部署单节点MongoDB(V4.2.25)

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

Java面试题(Spring篇)

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 Java面试题(Spring篇) 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主页…

[STM32] Keil MDK 新建工程编译不通过(warning: #2803-D和Error: L6218E)解决方法备忘

按照野火的PDF教程的第4章&#xff1a;[野火]《RT-Thread 内核实现与应用开发实战—基于STM32》.pdf 新建 Keil MDK 工程&#xff0c;工程设置完成后点击编译按钮&#xff0c;编译不通过&#xff1a; RTE\Device\ARMCM3\startup_ARMCM3.c(75): warning: #2803-D: unrecognize…

如何准备2024年汉字小达人:历年考题练一练-18道选择题解析

距离2024年第11届汉字小达人比赛还有七个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。阅读理解不需要。②把历年真题刷刷熟&#xff0c…

Mybatis之自定义映射resultMap

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

基于springboot+vue的失物招领平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

更智能的广告素材生成!看A/B测试如何驱动AIGC素材调优

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 前言&#xff1a;AIGC 大爆发&#xff0c;引发广告营销行业变革 ChatGPT 等 AI 产品引发的 AIGC 大爆发引起了各行业的震动&#xff0c;其中以图片生成甚至视频生成…

操作系统:malloc与堆区内存管理

malloc是函数而不是系统调用&#xff0c;他的底层是同调调用brk和mmap这两个系统调用实现功能的&#xff0c;具体选择brk还是mmap要看申请的空间大小以及malloc中的阈值&#xff08;一般是128kb&#xff09; 注意申请的空间只有使用才会触发缺页中断映射到物理内存 不理解的话先…

现货黄金做对冲的具体方法

现货黄金做对冲的具体方法是运用金融衍生工具和策略&#xff0c;以减轻或消除持有现货黄金所面临的市场风险。具体而言&#xff0c;投资者可通过期货合约、期权、掉期等金融工具来实现对冲&#xff0c;保障其投资价值不受金价波动的负面影响。 &#xfeff; 期货合约在对冲中…

Ceres求解非线性优化问题步骤与示例

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 在计算机视觉和机器人领域&#xff0c;经常需要解决非线性优化问题来估计相机姿态或运动模型。Ceres Solver是一个开源的C库&#xff0c;专门用于解决最小二乘问题&am…

HarmonyOS/OpenHarmony应用开发-HDC环境变量设置

hdc&#xff08;HarmonyOS Device Connector&#xff09;是 HarmonyOS 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在 windows/linux/mac 系统上与真实设备或者模拟器进行交互。 hdc 工具通过 HarmonyOS SDK 获取&#xff0c;存放于 /Huawei/Sdk/openhar…

sde的几个问题

数据库:aix6.1oracle11.2.0.1 sde数据为从原先oracle10.2.0.5中导入的。 环境&#xff1a;windows2008x64 安装sde10 for oracle11g x64oracle11.2.0.1x64客户端。 启动出现问题&#xff1a; ST_Geometry Schema Owner: (SDE) Type Release: 1007 Instance initialized fo…

HTTP协议初识

HTTP协议 HTTP协议简介与作用HTTP基本工作原理非持久连接与持久连接的区别HTTP请求与响应HTTP请求HTTP响应请求与响应的交互流程 HTTP方法实例GET 请求示例POST 请求示例HEAD 请求示例 使用场景 HTTP状态码HTTP消息结构与头字段头字段 HTTP的无状态性与状态管理初步了解安全性与…

力扣热门算法题 56. 合并区间,57. 插入区间,58. 最后一个单词的长度v

56. 合并区间&#xff0c;57. 插入区间&#xff0c;58. 最后一个单词的长度&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 56. 合并区间 解题思路 完整代码 Python Java ​编辑 5…

MCU技术的创新浪潮与产业变革

MCU技术的创新浪潮与产业变革 一、MCU技术的创新发展 MCU&#xff0c;即微控制器&#xff0c;作为现代电子设备的核心部件&#xff0c;一直在不断地创新与发展。随着科技的进步&#xff0c;MCU的性能得到了极大的提升&#xff0c;功能也越来越丰富。从8位到32位&#xff0c;再…