修改单链表时传入二级指针详解

修改单链表时传入二级指针详解

我们先来看一个例子:

1.int *p = &a;
notice: p的值,*p,&p注意区分
p的值:就是变量a的地址:0x11
*p: 就是变量a的值:1
&p:就是p的地址:ox22

在这里插入图片描述
p代表的是a的地址。如果要修改p指向的值,func(int * b) 需要一个指向整数的指针 (int*)。函数 func 接受一个指向整数的指针 pa,并将 pa指向的值修改为2。
在这里插入图片描述

2.在调用函数传参的时候,我们想改变指针p的指向,假设我们也传入一维指针的话,是改变不了的,因为现在p就是一维指针,想要改变它的指向,只有传入双重指针才可以改变它的指向。

调用函数void fun(int **pa),将指针的地址&p传入,此时pa=&p;pa的值也就是p的地址(&p)就是0x22,而*pa就是p的值,我们需要修改p的值,也就是p的指向。
在这里插入图片描述

&p 的含义是取指针变量 p 的地址。因为 p 是一个指向 int 类型的指针(int*),所以 &p 的类型是 int**,即指向 int 指针的指针。

函数 func 的执行
当 func(&p) 被调用时,以下操作发生:

pa在函数 func 中被初始化为 p 的地址。
*pa解引用 pa,即 *pa 现在是指向 a 的指针 p。
*pa= &c 将 p 修改为指向 c 的地址。

所以在 func(&p) 调用之后,p 不再指向 a,而是指向 c。
在这里插入图片描述

如果理解了上面的例子那么就知道了为什么修改单链表时要传入二级指针

一、使用 struct Node** 情况

当修改原始链表的头指针时,需要使用二重指针 struct Node** head_ref。这种情况通常发生在以下场景:

1.在链表头部插入节点:因为插入新的头节点后,原来的头指针需要指向新的头节点。
2.删除链表中的某个节点:如果删除的是头节点,你需要修改头指针。

示例:在链表头部插入节点

void insertAtHead(struct Node** head_ref, int new_data) {struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));new_node->data = new_data;new_node->next = (*head_ref);(*head_ref) = new_node;
}

示例:删除链表中的某个节点

void deleteNode(struct Node** head_ref, int key) {struct Node* temp = *head_ref, *prev;if (temp != NULL && temp->data == key) {*head_ref = temp->next;  // Changed headfree(temp);  // free old headreturn;}while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}if (temp == NULL) return;prev->next = temp->next;free(temp);
}

二、使用 struct Node* 情况

当不需要修改原始链表的头指针,只是遍历链表或修改链表中其他节点时,可以使用单指针 struct Node* head_ref。这种情况通常发生在以下场景:

1.在链表中间或尾部插入节点:你只需要修改特定节点的 next 指针,不需要修改头指针。
2.遍历链表:只需要读取头指针的值,而不需要修改它。

示例:在链表中间插入节点

void insertAfter(struct Node* prev_node, int new_data) {if (prev_node == NULL) {printf("The given previous node cannot be NULL");return;}struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));new_node->data = new_data;new_node->next = prev_node->next;prev_node->next = new_node;
}

示例:在链表尾部插入节点

void insertAtEnd(struct Node* head_ref, int new_data) {struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));struct Node* last = head_ref;new_node->data = new_data;new_node->next = NULL;if (head_ref == NULL) {head_ref = new_node;return;}while (last->next != NULL) {last = last->next;}last->next = new_node;
}

注意,如果链表为空,在尾部插入节点时,单指针版本可能会出现问题,因为它不能修改原始的头指针。可以改为二重指针以处理这种情况。

改进后的在链表尾部插入节点的函数:

void insertAtEnd(struct Node** head_ref, int new_data) {struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));struct Node* last = *head_ref;new_node->data = new_data;new_node->next = NULL;if (*head_ref == NULL) {*head_ref = new_node;return;}while (last->next != NULL) {last = last->next;}last->next = new_node;
}

改变链表的头指针就传二级指针,即:指向指针的指针。改变头指针不能传一级指针因为传送的过程就是拷贝的过程,相当于将头指针复制了一份,形参的改变不会影响实参,因此要改变链表的头指针需要传送二级指针。
总结:
使用 struct Node**:当需要修改原始链表的头指针时。
使用 struct Node*:当不需要修改原始链表的头指针,仅进行遍历或修改其他节点时。

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

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

相关文章

气膜篮球馆:理想的运动空间选择—轻空间

快速建造 气膜篮球馆的建造速度快,通常只需几周即可完成。这与传统建筑需要数月甚至数年的时间相比,显著缩短了工期。快速建造不仅能迅速投入使用,还减少了因工期延长而产生的额外费用。 成本效益 气膜结构相比传统建筑成本更低,特…

基于Llama Index构建RAG应用(Datawhale AI 夏令营)

前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,本文参与活动是2024 DataWhale AI夏令营;😲 在本文中作者将通过: Gradio、Streamlit和LlamaIndex介绍 LlamaIndex 构…

【C++题解】1212. 移动数组元素

问题:1212. 移动数组元素 类型:数组找数 题目描述: 在一个不重复的数组中,请将这个数组的最小数和数组第一个数交换,最大数和数组最后一个数交换。 输入: 第一行有一个整数 n ( 5≤n≤100 )…

【C】C语言静态链表转动态链表的技术探讨与实现

引言 在数据结构与算法的学习中,链表作为一种常用的线性表链式存储结构,具有灵活的内存分配和高效的插入删除操作等特点。根据链表在内存中的分配方式,链表可以分为静态链表和动态链表两种。静态链表在创建时预先分配一块连续的内存空间&…

微服务:nacos

Nacos 由Alibaba推出的集成于SpringCloudAlibaba中的一款开源注册中心框架 主要功能: 注册中心 配置管理 nacos的安装和部署 nacos默认访问端口8848 docker pull nacos/nacos-server:1.2.0 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8…

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 三、保存搜索 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域,单击试用样例数据。 在更多添加数据的方式页面下方,单击…

idea2019版本创建JavaWeb项目并配置Tomcat步骤

一、创建JavaWeb项目 1.新建项目File->New->Project 2. 选择JavaWeb应用在New Project窗口中选择Java后勾选Java EE中的Web Application后点击next即可 3.设置项目名称后点击finish即可 4.至此项目创建完成,检查文件是否齐全,开始配置Tomcat 二、…

免费的数字孪生平台助力产业创新,让新质生产力概念有据可依

关于新质生产力的概念,在如今传统企业现代化发展中被反复提及。 那到底什么是新质生产力?它与哪些行业存在联系,我们又该使用什么工具来加快新质生产力的发展呢?今天我将介绍一款为发展新质生产力而量身定做的数字孪生工具。 新…

spring ioc的原理

1、控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器) 2、依赖注入(DI):所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 参考资料…

中职省培丨2024年大数据技术中职教师专业技能培训班企业参观实践圆满结束

7月17日,“2024年大数据技术中职教师专业技能培训班(省培)”参训老师莅临广东泰迪智能科技股份有限公司产教融合实训中心开展企业参观实践。泰迪智能科技董事长张良均、中职业务部总监李振林、中职业务部经理黄炳德、校企合作经理吴桂锋及来自…

SCU(Seat Control Unit,座椅控制单元)

SCU也叫SCM(Seat Control Module) 智能座椅可以支持更多的座椅姿态调节,除了水平、高度、靠背常规调节,还支持旋转、腿托、肩部、侧翼等方向调节来实现舒适坐姿,智能座椅同时支持加热、通风、按摩、记忆、迎宾等功能。…

一款国外开发的高质量WordPress下载站模板主题

5play下载站是由国外站长开发的一款WordPress主题,主题简约大方,为v1.8版本, 该主题模板中包含了上千个应用,登录后台以后只需要简单的三个步骤就可以轻松发布apk文章, 我们只需要在WordPress后台中导入该主题就可以…

Linux系统学习日记——vim操作手册

Vim编辑器是linux下的一个命令行编辑器,类似于我们windows下的记事本。 目录 打开文件 编辑 保存退出 打开文件 打开 hello.c不存在也可以打开,保存时vim会自动创建。 效果 Vim打开时,处于命令模式,即执行命令的模式&#x…

Java的list集合总结

在编程语言中,我们必然少不了存储数据的容器,虽然我们有数组,但是数组是连续的开辟处一块连续的内存空间,我们的数据过大会无法存储完,数据量小,会浪费空间,所以我们需要使用集合存储数据&#…

前端JS特效第46集:js-实现响应式节庆活动砸金蛋效果

js-实现响应式节庆活动砸金蛋效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>响应式节庆活动砸金蛋…

redis持久化RDB(仅供自己参考)

&#xff08;1&#xff09;save命令&#xff1a;是直接占用主线程来执行持久化的&#xff08;因为redis是单线程的&#xff0c;如果执行save命令&#xff0c;则其他命令&#xff0c;无论查询还是怎么的都被阻塞了&#xff09; &#xff08;2&#xff09;bgsave命令&#xff1a…

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…

《基于 Kafka + Quartz 实现时限质控方案》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

OpenCv 如何在 Java 中使用

Java 项目引入 OpenCv 环境准备OpenCv介绍下载Maven 安装动态链接库 完成 环境准备 JDK 8 OpenCv 4.0.0 Maven 3.9 Windows 11 OpenCv 介绍 OpenCV&#xff08;开源计算机视觉库&#xff09;是一个功能强大的计算机视觉和机器学习库。它提供了广泛的工具和算法&#xff0c;用…

jquery实现文字点选验证码

jquery实现文字点选验证码 git地址&#xff1a;点击获取源码 一、功能说明&#xff08;文字点选验证码&#xff09; 词组库内存在大量3~6字随机词组&#xff0c;从词组库内随机找出一组词组&#xff0c;随机展现在显示区点击按钮&#xff0c;弹出验证码区域将词组内的随机数量…