数据结构 链表2

news2025/1/27 6:24:04

目录

前言:

一,反转一个链表(迭代)

 二,打印一个链表(递归)

三,反转一个链表(递归)

四,双向链表

总结


前言:

我们根据 [文章  链表1] 可以知道链表相比较于数组的优缺点和计算机是如何管理内存的,然后介绍了链表的实现,头插法,任意节点插入,任意节点删除,接下来我们就来学习反转链表与打印链表的迭代和递归操作


 

一,反转一个链表(迭代)

反转一个链表并不是移动位置,而是改变输出方向,就好比如数组一样,我们打印一个反转的数组,就是for循环反着循环就好了,取决于下角标,而不是数据的位置,这里也是同理 

#include<iostream>
#include<new>
using namespace std;

struct Node {
	int data;
	Node* Next;
};

Node* head;


void reverse(){
	Node* current, * prev, * next;
	current = head;  prev = NULL;
	while (current != NULL) {
		next = current->Next;
		current->Next = prev;  //这里可以设置第一个节点为NULL
		prev = current;
		current = next;
	}
	head = prev;
}


void print() {
	Node* temp = head;
	while(temp!=NULL) {
		cout << temp->data << "  ";
		temp = temp->Next;
	}
}


int main() {
	head = NULL;
	Node* temp1 = new Node;
	temp1->data = 1;
	temp1->Next = NULL;

	Node* temp2 = new Node;
	temp2->data = 2;
	temp2->Next = NULL;

	Node* temp3 = new Node;
	temp3->data = 3;
	temp3->Next = NULL;

	Node* temp4 = new Node;
	temp4->data = 4;
	temp4->Next = NULL;

	temp1->Next = temp2;  temp2->Next = temp3;  temp3->Next = temp4;
	head = temp1;
	reverse();
	print();
}

这是反转一个链表的操作,然后我们来详细的看一下这个反转链表的函数

void reverse(){
	Node* current, * prev, * next;
	current = head;  prev = NULL;
	while (current != NULL) {
		next = current->Next;
		current->Next = prev;  //这里可以设置第一个节点为NULL
		prev = current;
		current = next;
	}
	head = prev;
}

这里就是反转链表的函数,我们反转链表主要就是利用改变后面的指向,使得输出方向发生变化,因为head永远都是这个链表的第一个节点的位置

这里设置了三个指针

prev:    先前的      这个是用来当current为空的时候,好用prev给head提供最好一个节点的位置,还有一个就是让current指向前一个

current:现在的      这个是用来表示现在这个节点的,利用current来来指向前一个

next:    下一个的   这个是用来为current提供下一个位置的

 二,打印一个链表(递归)

 这里就不讲解递归的思想了,可以去看我的文章函数的递归

我们根据这个思想来编写这个递归思想书写这个代码

#include<iostream>
#include<new>
using namespace std;

struct Node {
	int data;
	Node* Next;
};

Node* head;

void reverse(){
	Node* current, * prev, * next;
	current = head;  prev = NULL;
	while (current != NULL) {
		next = current->Next;
		current->Next = prev;  //这里可以设置第一个节点为NULL
		prev = current;
		current = next;
	}
	head = prev;
}

void print1(Node* p) {
	if (p == NULL) {
		return;
	}
	cout << p->data << " ";
	print1(p -> Next);
	cout << p->data << " ";
}

int main() {
	head = NULL;
	Node* temp1 = new Node;
	temp1->data = 1;
	temp1->Next = NULL;

	Node* temp2 = new Node;
	temp2->data = 2;
	temp2->Next = NULL;

	Node* temp3 = new Node;
	temp3->data = 3;
	temp3->Next = NULL;

	Node* temp4 = new Node;
	temp4->data = 4;
	temp4->Next = NULL;

	temp1->Next = temp2;  temp2->Next = temp3;  temp3->Next = temp4;
	head = temp1;
	reverse();
	print1(head);
}

这个里面有利用递归来书写的打印链表

if (p == NULL) {
	return;
}

这个为递归的基准条件,什么时候跳出递归进行反转

cout << p->data << " ";
print1(p -> Next);
cout << p->data << " ";

这个是递归的过程,上面的为正序打印,下面为逆序打印,至于为什么这样,看我的文章函数的递归

三,反转一个链表(递归)

#include<iostream>
#include<new>
using namespace std;

struct Node {
	int data;
	Node* Next;
};

Node* head;

void reverse1(Node*p){
	if (p->Next == NULL) {
		head = p;
		return;
	}
	reverse1(p->Next);
	Node* q = p->Next;
	q->Next = p;
	p->Next = NULL;
}

void print1(Node* p) {
	if (p == NULL) {
		return;
	}
	cout << p->data << " ";
	print1(p -> Next);
}

int main() {
	head = NULL;
	Node* temp1 = new Node;
	temp1->data = 1;
	temp1->Next = NULL;

	Node* temp2 = new Node;
	temp2->data = 2;
	temp2->Next = NULL;

	Node* temp3 = new Node;
	temp3->data = 3;
	temp3->Next = NULL;

	Node* temp4 = new Node;
	temp4->data = 4;
	temp4->Next = NULL;

	temp1->Next = temp2;  temp2->Next = temp3;  temp3->Next = temp4;
	head = temp1;
	reverse1(head);
	print1(head);
}

我们来看这个递归反转链表的代码

void reverse1(Node*p){
	if (p->Next == NULL) {
		head = p;
		return;
	}
	reverse1(p->Next);
	Node* q = p->Next;
	q->Next = p;
	p->Next = NULL;
}

这个相较于迭代,代码量少了很多

if语句是用来设置基准条件的,着p是为了寻找最后一个节点赋值给head,另外一个就是挖掘深度,提供可以改变指向的一个环境,后面就是递归完之后,我们知道这个如果是打印数字的话就是反着来的,所以我们就知道这个已经是到最后一个节点了,然后我们只需要改变指向

  1. 递归调用过程

    • 初始调用:reverse1(head),即 reverse1(A)

    • 递归调用:reverse1(B)

    • 递归调用:reverse1(C)

    • 递归调用:reverse1(D)

    • DNextNULL 时,设置 head = D,并返回。

 我们可以知道在D的时候,Next已经为空,则这个时候就开始return了,然后我们就进入C,我们以C为例子来讲解

这个就是过程,改变下一个,本个为空

四,双向链表

struct Node {
	int data;
	Node* next;
	Node* prev;
};

双向链表是由两个地址域的

优点:如果我们由指向任意节点的指针,那么我们是方便反向查询的(仅需一个指针)

缺点:代码量增加,占用内存 

 双向链表的实现跟单向链表很像,只是多了一个地址域而已,这里就不过多解释了,对于堆的数据,我们链表一般都是在堆的,在堆里面查找数据一般都是利用指针


总结

我们目前基本学习完了链表的全部知识

-----增删改查

-----打印链表(迭代,递归)

-----反转链表(迭代,递归)

增删改查:这个就是要注意指向问题,比如增加到中间的位置的时候,是需要找到前面那个节点进程处理的

递归        :需要注意的就是基准条件和过程,释放到入口的上面还是下面

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

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

相关文章

Linux查看服务器的内外网地址

目录&#xff1a; 1、内网地址2、外网地址3、ping时显示地址与真实不一致 1、内网地址 ifconfig2、外网地址 curl ifconfig.me3、ping时显示地址与真实不一致 原因是dns缓存导致的&#xff0c;ping这种方法也是不准确的&#xff0c;有弊端不建议使用&#xff0c;只适用于测试…

【kong gateway】5分钟快速上手kong gateway

kong gateway的请求响应示意图 安装 下载对应的docker 镜像 可以直接使用docker pull命令拉取&#xff0c;也可以从以下地址下载&#xff1a;kong gateway 3.9.0.0 docker 镜像 https://download.csdn.net/download/zhangshenglu1/90307400&#xff0c; postgres-13.tar http…

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…

Langchain+讯飞星火大模型Spark Max调用

1、安装langchain #安装langchain环境 pip install langchain0.3.3 openai -i https://mirrors.aliyun.com/pypi/simple #灵积模型服务 pip install dashscope -i https://mirrors.aliyun.com/pypi/simple #安装第三方集成,就是各种大语言模型 pip install langchain-comm…

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件&#xff1a; Eureka/Nacos:注册中心&#xff1b;Ribbon:负载均衡&#xff1b;Feign:远程调用&#xff1b;Hystrix/Sentinel:服…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为&#xff1a; 8.3.0 从而保证oc的…

electron打包客户端在rk3588上支持h265硬解

目录 前言 chromium是如何支持h265硬解 electron/chromium第一次编译 electron/chromium第二次编译 前言 我们的客户端程序是用electron打包的前端程序&#xff0c;其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的&#xff0c;但视频源…

基于物联网的风机故障检测装置的设计与实现

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析&#xff0c;本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示&#xff0c;系统风机故障检测装置采用STM32F103单片机作为控制器&#xff0c;并通过DS18B20温度传感器、ACS712电…

为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️

前言 在使用 Spring 框架时&#xff0c;依赖注入&#xff08;DI&#xff09;是一个非常重要的概念。通过注解&#xff0c;我们可以方便地将类的实例注入到其他类中&#xff0c;提升开发效率。Autowired又是被大家最为熟知的方式&#xff0c;但很多开发者在使用 IntelliJ IDEA …

软件工程的概论

软件的概念与特点 软件的定义 软件 程序 数据 文档 软件的特征 1。软件是人开发的 2。软件生产是简单的拷贝 3。软件会多次生产 4。软件开发环境对产品影响很大 5。 软件的双重作用 一方面是一种产品另一方面是开发其他软件产品的工具。 软件分类 按软件功能&…

1. 握手问题python解法——2024年省赛蓝桥杯真题

原题传送门&#xff1a;1.握手问题 - 蓝桥云课 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人&#xff0c;…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…

Visual Studio Code修改terminal字体

个人博客地址&#xff1a;Visual Studio Code修改terminal字体 | 一张假钞的真实世界 默认打开中断后字体显示如下&#xff1a; 打开设置&#xff0c;搜索配置项terminal.integrated.fontFamily&#xff0c;修改配置为monospace。修改后效果如下&#xff1a;

使用ArcMap或ArcGIS Pro连接达梦数据库创建空间数据库

一、ArcMap 1、本地windows安装 32 位 DM 数据库客户端 2、覆盖dll 将 32 位 DM 数据的..\dmdbms\bin 目录中的 .dll 文件全部拷贝到 ArcGIS 的 ..\Desktop10.5\bin 目录下&#xff0c;有同名文件直接覆盖掉 3、开启达梦数据库空间扩展支持 使用管理员用户登录数据&#xff…

案例研究丨浪潮云洲通过DataEase推进多维度数据可视化建设

浪潮云洲工业互联网有限公司&#xff08;以下简称为“浪潮云洲”&#xff09;成立于2018年&#xff0c;定位于工业数字基础设施建设商、具有国际影响力的工业互联网平台运营商、生产性互联网头部服务商。截至目前&#xff0c;浪潮云洲工业互联网平台连续五年入选跨行业跨领域工…

ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件

介绍 .NET 6.0 已经发布&#xff0c;ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如&#xff0c;“谁动了我的奶酪”&#xff0c;它在哪里Startup.cs&#xff1f;在这篇文章中&#xff0c;我将深入研究这个问题&#xff0c;看看它移动到了哪里以及其他变化。…

iOS 集成ffmpeg

前言 本来打算用flutter去实现一个ffmpeg的项目的&#xff0c;不过仔细分析了一下&#xff0c;我后期需要集成OpenGL ES做视频渲染处理&#xff0c;OpenGL ES的使用目前在flutter上面还不是很成熟&#xff0c;所以最后还是选择用原生来开发 ffmpeg集成到iOS工程 iOS对于ffmp…

基于微信小程序的移动学习平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

WPS计算机二级•幻灯片的基础操作

听说这是目录哦 PPT的正确制作步骤&#x1f6e3;️认识PPT界面布局&#x1f3dc;️PPT基础操作 快捷键&#x1f3de;️制作PPT时 常用的快捷技巧&#x1f3d9;️快速替换PPT的 文本字体&#x1f303;快速替换PPT 指定文本内容&#x1f305;能量站&#x1f61a; PPT的正确制作步…

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代&#xff0c;数据如同新时代的石油&#xff0c;蕴含着巨大的价值。从商业决策到科研探索&#xff0c;从城市规划到环境监测&#xff0c;海量数据的高效处理、精准分析与直观可视化&#xff0c;已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…