当前位置: 首页 > 编程日记 > 正文

面试高频题:单链表的逆置操作/链表逆序

函数内对形参的操作并不能影响实参,函数内修改的是实参的副本。要想在函数内部修改输入参数,要么传入的是实参的引用,要么传入的是实参的地址。


#include <iostream>
#include <cstdlib>
#include <cstring>//strlen
using namespace std;
//template <class T>
class node
{public:node * next;char data;
};
node *node_reverse(node *head)
{//如果一个函数的输入参数有指针,一定要记住判断指针时候为空//1>:在使用一个指针之前一定要判断它是否为空;//2>:使用完后要释放由指针指向的存储单元//3>:释放完存储单元后要将指针赋值为NULL;if(head->next==NULL || head==NULL)return head;node* pPre=head;    //先前指针node* pCurrent=pPre->next;  //当前指针node* pNext=NULL;       //后继指针//要注意这里面的顺序,先将pNext保存在pCurrent中,//然后再将pNext移动到下一个元素,然后才能改动pCurrent//while(pCurrent!=NULL){pNext=pCurrent->next;pCurrent->next=pPre;pPre=pCurrent;pCurrent=pNext;}head->next=NULL;head=pPre;return head;
}
/**************
void init_node(node *tail,char *init_array)
这样声明函数是不正确的,函数的原意是通过数组初始化链表
若链表结点传入的是指针,则并不能创建链表,除非是二维指针
即指向指针的指针
****************/
void init_node_by_referenceToPointer(node *&tail,const char *init_array)
{node * tmp = NULL;int j=strlen(init_array);for(int i=0; i<j; i++){tmp = new node;tmp->data = *(init_array+i);tmp->next = tail;tail = tmp;}
}
/***************************************
void init_node_by_referenceToPointer(node &*tail,char *init_array)
error: cannot declare pointer to 'class node&'
****************************************/
void init_node_by_pointerToPointer(node **tail,const char *init_array)
{node * tmp = NULL;int j=strlen(init_array);for(int i=0; i<j; i++){tmp = new node;tmp->data = *(init_array+i);tmp->next = *tail;*tail = tmp;}
}
void display(node *nn,char *print=NULL)
{if(nn==NULL){cout << "no data to display\n";return ;}cout<<print;node *dis = nn;while(dis!=NULL){cout << dis->data;dis = dis->next;}
}//释放动态申请的空间
void distroy(node *nn)
{if (nn==NULL){return ;}while (nn!=NULL){node *tmp = nn;nn = nn->next;delete tmp;}
}void test_by_referenceToPointer()
{node *test = NULL;char *test_array="wang_shi_hui";init_node_by_referenceToPointer(test,test_array);//如果输入参数是指向指针的引用display(test,"单链表逆置前\n");cout << "\n init_node_by_referenceToPointer" << endl;node *tmp = node_reverse(test);if(test==NULL)exit(0);display(tmp,"单链表逆置后\n");//tmp和test指向的存储空间已经使用完毕,应该释放掉他们申请的空间!//并且,要将他们赋值为NULL,否则他们将成为野指针!!!!,一定要注意了~~distroy(tmp);//释放动态申请的内存tmp = NULL;//将他们重新赋值为NULL,不然就会成为野指针~~~~~test = NULL;cout << "\n after destory tmp= " << tmp << endl;//如果上面没有tmp = NULL;test = NULL;,display将会出错,//因为在display开始的时候判断传入的参数是否为NULL,如果不把野指针赋值为NULL,//那么判断就没有效果,会继续指向display中的while语句,而此时指针所指向的存储空间已经被释放掉了,//这样就会出现异常.display(test);}
void test_by_pointerToPointer()
{node *test = NULL;char *test_array="123456789";init_node_by_pointerToPointer(&test,test_array);//如果输入参数是指向指针的指针display(test,"单链表逆置前\n");cout << "\n init_node_by_pointerToPointer" << endl;node *tmp = node_reverse(test);if(test==NULL)exit(0);display(tmp,"单链表逆置后\n");//tmp和test指向的存储空间已经使用完毕,应该释放掉他们申请的空间!//并且,要将他们赋值为NULL,否则他们将成为野指针!!!!,一定要注意了~~distroy(tmp);//释放动态申请的内存tmp = NULL;//将他们重新赋值为NULL,不然就会成为野指针~~~~~test = NULL;cout << "\n after destory tmp= " << tmp << endl;//如果上面没有tmp = NULL;test = NULL;,display将会出错,//因为在display开始的时候判断传入的参数是否为NULL,如果不把野指针赋值为NULL,//那么判断就没有效果,会继续指向display中的while语句,而此时指针所指向的存储空间已经被释放掉了,//这样就会出现异常.display(test);}
int main()
{test_by_referenceToPointer();cout<<"\n---------------------\n";test_by_pointerToPointer();
}
/************************************************
单链表逆置前
iuh_ihs_gnawinit_node_by_referenceToPointer
单链表逆置后
wang_shi_huiafter destory tmp= 0
no data to display---------------------
单链表逆置前
987654321init_node_by_pointerToPointer
单链表逆置后
123456789after destory tmp= 0
no data to display
*************************************************/



相关文章:

猖狂!微软、思科源码惨遭黑客 100 万美元打包出售

【编者按】SolarWinds 黑客攻击事件又延伸出新的危害了&#xff1a;微软、思科、FireEye 等公司的源代码在一网站公开出售&#xff0c;明码标价&#xff0c;甚至打包价为一百万&#xff0c;究竟是什么情况&#xff1f;整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNn…

vmstart的用法

vmstat命令是最常见的Linux/Unix监控工具&#xff0c;可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率&#xff0c;内存使用&#xff0c;虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令&#xff0c;一个是Linux/Unix都支持&#xff0c;二是…

配置.net 3.0开发环境

开发.net 3.0 应用程序&#xff0c;需要配置开发环境。配置步骤如下&#xff1a;1. 开发.net 3.0&#xff0c;首先当然要安装.NET Framework 3.0 了安装前使用windowsupdate安装好最新的更新&#xff08;Windows XP SP2 和Windows 2003 SP1一定要安装&#xff09;&#xff0c;下…

杭电 hdu 2096

小明AB&#xff1a;#include<iostream> using namespace std; int main(){int n;cin>>n;cin.ignore();while(n--){int a,b;cin>>a>>b;cout<<(a%100b%100)%100<<endl;}return 0; }转载于:https://blog.51cto.com/beyond316/1261849

关于2021年及未来,人工智能的5大趋势预测

吴恩达教授&#xff08;美国斯坦福大学计算机科学系和电子工程系副教授&#xff09;曾反复强调一句名言&#xff1a;"人工智能是新电力。" 我们正跟随着人工智能发展的脚步&#xff0c;走向第四次工业革命的浪潮之巅。 毋庸置疑&#xff0c;人工智能已经成为社会进步…

京东618:智能机器人JIMI的进击之路

ArchSummit全球架构师峰会深圳站将于2017年7月7日~8日在深圳华侨城洲际酒店召开&#xff0c;大会设置了相关专题来深入解读电商大促背后的技术故事&#xff0c;大会还邀请了eBay、WalmartLabs等国外顶尖技术专家&#xff0c;分享AI促销、搜索引擎、异地多活、库存物流等核心架构…

读懂深度迁移学习,看这文就够了 | 赠书

百度前首席科学家、斯坦福大学副教授吴恩达&#xff08;Andrew Ng&#xff09;曾经说过&#xff1a;迁移学习将是继监督学习之后的下一个促使机器学习成功商业化的驱动力。本文选自《深度学习500问&#xff1a;AI工程师面试宝典》&#xff0c;将重点介绍目前最热门的深度迁移学…

Visual Studio 2005 IDE 技巧和窍门

发布日期&#xff1a; 2007-02-26 | 更新日期&#xff1a; 2007-02-26James Lau Microsoft 项目经理 适用于&#xff1a; Microsoft Visual Studio 2005 摘要&#xff1a;Visual Studio 2005 是目前业内一流的开发工具&#xff0c;我想在此与大家分享一些使用技巧和窍门&#x…

ZOJ 1025 Wooden Sticks(快排+贪心)

题目链接&#xff1a;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId25 题目大意&#xff1a;机器运送n个木条&#xff0c;每个木条有一个长度和重量。运送第一根木条需要1分钟的准备时间&#xff0c;接下来如果后一根木条的长度和重量都大于等于前一根木条&…

Swift:UIKit中Demo(一)

关于Swift的基本概念及语法知识。我在前面的章节中已经介绍了非常多。这一节和下一节主要有针对性的解说Swift在实际UIKit开发中的使用场景及注意点。先来看看Demo的终于效果图。Demo分析&#xff1a; 1. 界面上面有三个button&#xff0c;他们的宽度不一致。 2. 点击每一个but…

jdbc封装与多并发的共鸣

欢迎来到&#xff1a;http://observer.blog.51cto.com代码的封装是一门艺术&#xff0c;封装得好&#xff0c;不但给自己便利&#xff0c;还可以给自己的维护提供帮助&#xff1b;同时&#xff0c;封装得好&#xff0c;还可以给看自己代码的人以赏心悦目的感觉&#xff0c;团队…

计算机视觉怎样实现自我超越?更大规模更精准的数据

最新发布的《2021中国人工智能应用趋势报告》强调&#xff0c;数据、算力和算法是支撑人工智能发展的"三驾马车"&#xff0c;为模型训练提供基本资料的「数据」&#xff0c;是人工智能的根基。 随着互联网、社交媒体、移动设备和传感器的大量普及&#xff0c;其产生…

Visual Studio 2005 Web Deployment Projects版本不同引发的问题

为了方便Visual Studio 2005发布为单一dll&#xff0c;微软发布了一个Visual Studio 2005 插件&#xff0c;Visual Studio 2005 Web Deployment Projects&#xff0c;在微软的不同文档里&#xff0c;这个插件提供了两个下载地址&#xff0c;分别是&#xff1a; 下载地址一&…

【书籍下载链接】_2_第二轮_计算机专业书籍

各位朋友&#xff0c;下面是我收集的书籍&#xff0c;介绍给大家&#xff0c;有需要可以分享给大家&#xff0c;如果看的还可以&#xff0c;请购买纸质版的图书。 驱动器 J 中的卷是 Elements 卷的序列号是 8AAF-3206 j:\ 的目录 2014/01/20 20:00 1,533,385 WinCE.pdf2010/09/…

VS2005发布、生成网站时如何设置固定的dll文件名?

在用VS2005发布网站项目时,默认生成bin目录下的.dll文件名是随机命名的; 如果要固定生成文件名如何固定呢&#xff1f;有以下两种方案&#xff1a; 一、每个页面的程序集分别生成对应的dll; 方法&#xff1a;在“发布网站”的选项中&#xff0c;勾选“使用固定命名和单页程…

android 广播机制

1&#xff1a;首先说andoid 广播分为系统的和 自定义的 2&#xff1a;注册方式呢&#xff0c;也是两种&#xff0c;1&#xff1a;静态注册&#xff0c;在manifest.xml 文件中注册的 2&#xff1a;动态注册&#xff0c;用filter 区分 不说了 占代码 首先是动态注册&#xff1a;…

2021第一融!第四范式完成D轮7亿美元融资

来源丨第四范式头图丨来源于第四范式近日&#xff0c;第四范式宣布完成D轮融资&#xff0c;融资金额7亿美元。本轮融资由春华资本、博裕资本、厚朴投资领投&#xff0c;并引入国家制造业转型基金、国开、国新、中国建投、中信建投、海通证券等战略股东&#xff0c;红杉中国、中…

springboot-26-springboot 集成rabbitmq

rabbitmq是基于AMQP规范的一个消息代理, 它可以兼容jms, 支持其他语言, 并且可以跨平台 1, 安装 1) 普通安装 度娘: 2) docker 安装 sudo docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:3-management 安装成功后: 使用 guest/guest 用户登录 2 使用: 1) 添加 rabbi…

asp.net中的联动菜单

目标达到的效果&#xff1a;两个下拉框&#xff0c;第二个跟随第一个变化而变化&#xff0c;使用客户端脚本JavaScript在ASP.NET环境下实现。 第一步&#xff1a;建立JavaScript脚本&#xff1a; 在Page_Load中建立并注册这个js脚本&#xff1a; string scriptKey "Menu…

2020长沙“科技之星”榜单重磅揭晓,近百家企业凭实力“出道”!

今天&#xff0c;「INFLUENCE长沙 2020年度“科技之星”企业评选」&#xff08;下文统称「长沙科技之星」&#xff09;圆满收官&#xff0c;评选结果正式揭晓&#xff01;作为专业的 IT 社区&#xff0c;CSDN 多年来与千万技术人员、技术企业共同见证了产业的发展和时代的变更…

CENTOS6.4 IBUS输入法不显示候选词解决办法

IBUS输入法 不显示候选词原因分析&#xff1a;输入im-chooser时候&#xff0c;显示找不到gtk模块&#xff1b;原因为升级python后的版本&#xff0c;不能导入gtk。找到能够导入gtk版本的python,然后默认python设置为此版本。故障解决&#xff1a;删除或更改默认python版本# whi…

sql server 表索引碎片处理

DBCC SHOWCONTIG (Transact-SQL) SQL Server 2005 其他版本更新日期&#xff1a; 2007 年 9 月 15 日 显示指定的表或视图的数据和索引的碎片信息。 重要提示&#xff1a;后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能&#xff0c;并着手修…

ASP.NET2.0 GridView小技巧汇粹

1)GridView绑定数据源控件,需要有编辑和删除选项按钮时,数据源控件必须提供SQL操作语句或存储过程调用,一般,我的推荐做法是,使用无意义的SQL语句或存储过程来使GridView的编辑和删除按钮可以生成,具体的编辑更新和删除操作在代码运行时而不是在控件设计时指定,虽然多写了一点代…

树莓派出微控制器了!Raspberry Pi Pico 只需 4 美元

整理 | 郑丽媛来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;昨天&#xff0c;树莓派搞了个大动作&#xff1a;推出了首款微控制器开发板 Raspberry Pi Pico&#xff01;该开发板基于树莓派开发的全新芯片——RP2040&#xff0c;并且作为双核 Arm Cortex-M0 的它…

“chaos”的算法--之链表面试题

【 声明&#xff1a;版权所有&#xff0c;欢迎转载。 联系信箱&#xff1a;yiluohuanghungmail.com】前两天倩仔仔给我了一套试题让我看&#xff0c;整体来说感觉题都还算不错&#xff0c;从中随便找了两道。先看题吧&#xff01;1、怎样判断一个单链表中是都存在环路&#xff…

ABP官方文档翻译 6.1.2 MVC视图

ASP.NET MVC 视图 介绍AbpWebViewPage基类介绍 ABP通过Abp.Web.Mvc nuget包集成到MVC视图。你可以如往常一样创建正常的MVC视图。 AbpWebViewPage基类 ABP提供了AbpWebViewPage&#xff0c;它定义了一些有用的属性和方法。如果你使用启动模板创建的工程&#xff0c;那么你所有的…

ASP.NET 打开新窗口几种方法

ASP.NET打开新窗口方法一:Response.Write("<script language/"javascript/">window.open(aaa.aspx,新窗口,/"toolbaryes,locationno,directoriesyes,statusyes,menubaryes,resizableyes,scrollbarsyes/");</script>");这种方式代码每…

Hibernate的使用梳理

Hibernate创建步骤 &#xff08;五大核心接口&#xff1a;Configuration/SessionFactory/Session/Transaction/Query&#xff09; 1.新建java工程&#xff0c;导入需要的jar包。 2.创建hibernate.cfg.xml配置文件和Test.java工具类。配置好相应的实体对象User.java User.hbm.x…

驭势科技引入国家队战略注资,完成超10亿元人民币融资

2021年1月25日&#xff0c;驭势科技&#xff08;UISEE&#xff09;宣布完成累计金额超10亿元人民币的新一轮融资&#xff0c;并获得国开制造业转型升级基金的战略注资。这是国开制造业转型升级基金在自动驾驶领域的首笔投资。2019年11月&#xff0c;国家制造业转型升级基金股份…

[Python爬虫] 之二十二:Selenium +phantomjs 利用 pyquery抓取界面网站数据

一、介绍 本例子用Selenium phantomjs爬取界面&#xff08;https://a.jiemian.com/index.php?msearch&aindex&typenews&msg电视&#xff09;的资讯信息&#xff0c;输入给定关键字抓取资讯信息。 给定关键字&#xff1a;数字&#xff1b;融合&#xff1b;电视 抓取…