单链表的逆置-C++实现

单链表逆置实现(C++) 对于单链表的逆置有两种方法可以实现 (1)利用辅助指针实现 基本思想:在遍历结点的过程中,设置辅助指针,用于记录先前遍历的结点。这样依次遍历的过程中只需修改其后继结点的next域即可。 实现代码如下: typedef int DataType; //类型定义   typedef struct node{  //单链表定义         DataType data;         str... 阅读详情

对于单链表的逆置有两种方法可以实现:

(1)利用辅助指针

         基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。

         实现代码:

  1. typedef int DataType; //类型定义  
  2. typedef struct node{  //单链表定义  
  3.       DataType data;  
  4.       struct node* next;  
  5. }LinkedNode,*LinkList;  
  6. void ReverseList(LinkList& ListHead)  
  7. {  
  8.     cout<<"Begin to Reverse the List"<<endl;  
  9.     if( (NULL==ListHead)||(NULL==ListHead->next) )return ;  //边界检测  
  10.     LinkedNode* pPre=ListHead;    //先前指针  
  11.     LinkedNode* pCur=pPre->next;  //当前指针  
  12.     LinkedNode* pNext=NULL;       //后继指针  
  13.     while(pCur!=NULL)  
  14.     {  
  15.         pNext=pCur->next;  
  16.         pCur->next=pPre;  
  17.         pPre=pCur;  
  18.         pCur=pNext;  
  19.     }  
  20.     ListHead->next=NULL;  
  21.     ListHead=pPre;        //记录下新的头结点  
  22. }  

                 

           示意图:

(2)递归

         基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。

         实现代码:

写了两个版本

I、返回值为空

  1. void ReverseList(LinkedNode* pCur,LinkList& ListHead)  
  2. {  
  3.     if( (NULL==pCur)||(NULL==pCur->next) )  
  4.     {  
  5.         ListHead=pCur;  
  6.     }  
  7.     else  
  8.     {  
  9.         LinkedNode* pNext=pCur->next;  
  10.         ReverseList(pNext,ListHead); //递归逆置后继结点  
  11.         pNext->next=pCur;            //将后继结点指向当前结点。  
  12.         pCur->next=NULL;  
  13.     }  
  14. }  


II、返回值为结点类型

  1. LinkedNode* ReverseList(LinkedNode* pCur,LinkList& ListHead)  
  2. {  
  3.     cout<<"Begin to Reverse the List"<<endl;  
  4.     if( (NULL==pCur)||(NULL==pCur->next) )  
  5.     {  
  6.             ListHead=pCur;  
  7.             return pCur;  
  8.     }  
  9.     else  
  10.     {  
  11.         LinkedNode* pTemp=ReverseList(pCur->next,ListHead); //递归逆置后继结点  
  12.         pTemp->next=pCur;   //将后继结点指向当前结点  
  13.         pCur->next=NULL;  
  14.         return pCur;  
  15.     }  
  16. }  



         示意图:

        

下面给出完整的程序:

  1. #include<iostream>  
  2. using namespace std;  
  3. const int N=6;  
  4. typedef int DataType;//类型定义  
  5. typedef struct node{ //单链表  
  6.       DataType data;  
  7.       struct node* next;  
  8. }LinkedNode,*LinkList;  
  9. /****由数组创建单链表****/  
  10. LinkList CreateList(DataType a[N])  
  11. {  
  12.     LinkedNode* ListHead=new LinkedNode();  
  13.     ListHead->data=a[0];  
  14.     ListHead->next=NULL;  
  15.     for(int i=N-1;i>=1;i--)  
  16.     {  
  17.         LinkedNode* p=new LinkedNode();  
  18.         p->data=a[i];  
  19.         p->next=ListHead->next;  
  20.         ListHead->next=p;  
  21.     }  
  22.     return ListHead;  
  23. }  
  24. /****输出单链表****/  
  25. void PrintList(LinkList ListHead)  
  26. {  
  27.     if(NULL==ListHead)cout<<"The List is empty!"<<endl;  
  28.     else  
  29.     {  
  30.         LinkedNode* p=ListHead;  
  31.         while(p!=NULL)  
  32.         {  
  33.             cout<<p->data<<" ";  
  34.             p=p->next;  
  35.         }  
  36.         cout<<endl;  
  37.     }  
  38. }  
  39. void ReverseList(LinkedNode* pCur,LinkList& ListHead)  
  40. {  
  41.     if( (NULL==pCur)||(NULL==pCur->next) )  
  42.     {  
  43.         ListHead=pCur;  
  44.     }  
  45.     else  
  46.     {  
  47.         LinkedNode* pNext=pCur->next;  
  48.         ReverseList(pNext,ListHead); //递归逆置后继结点  
  49.         pNext->next=pCur;            //将后继结点指向当前结点。  
  50.         pCur->next=NULL;  
  51.     }  
  52. }  
  53. int main()  
  54. {  
  55.     int a[N]={1,2,3,4,5,6};   
  56.     LinkedNode* list=CreateList(a);  
  57.     PrintList(list);  
  58.     LinkedNode*pTemp=list;  
  59.     ReverseList(pTemp,list);  
  60.     PrintList(list);  
  61.     return 0;  
单链表的逆置(C++版) 单链表的逆置是一个很有趣的问题,同时也是很多公司在面试时经常会拿出来“为难”面试者的题,比如博主在面试Microsoft的时候就被问到了这个问题。 问题描述:写一个程序,创建一个单向链表,并通过逆置函数使得该链表的方向反转,即头变尾,尾变头。 比如一个链表是这样的:1 -> 2 -> 3 -> 4 -> 5,逆置后则变成:5 -> 4 -> 3 -> 2 -> 1。 分析:该问题可以有两种解 阅读详情

相关推荐

用C++实现单链表的创建、逆置和输出

实现创建一个节点可控的单链表,并逆置输出

lfeng_coding的博客 8117

单链表逆置——C++实现的两种方法

方法一: 实现单链表逆置的时候,把下一节点提前保存,然后修改指向关系,再更新遍历的节点,最后更改头指针的指向和引用即可 //方法一 #include &lt;stdio.h&gt; //单链表的结构体 typedef struct node { int data; struct node* next; }Node,*pNode; void reverseLinkList(pNode...

jeremiah的博客 5290

C++实现单链表的创建、插入、删除、逆置操作

#include using namespace std; typedef struct List_Node { int data; struct List_Node *next; } node, *node_pointer; node *creat( int num ) { node_pointer p; p = new node; p -> data = num; p ->

聚精会神搞建设 1892

单链表--就地逆置--C++实现

//以单链表作为存储结构,实现线性表的就地逆置。 #include using namespace std; struct Node { int data; Node *next; }; class LinkList { public: LinkList(int a[], int n); ~LinkList(); void inversion(Node *first); Node *show(int n); private: Node *first, *s, *p; }; //利用头插法定义一个单链表 Li

qq_45911550的博客 3190

C++单循环链表逆置的算法

C++单循环链表逆置的算法 ,非常的不错的算法,还支持读文件功能。

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3206

用C++实现单链表的创建、逆置和输出 的两种方法

http://blog.youkuaiyun.com/lfeng_coding/article/details/47300563 题目描述:在已知单链表头节点的情况下,设计算法逆置单链表并输出 方法一:采用首先将头节点指向空,让其变为尾节点,然后利用中间节点 p、q 将其后的节点一个接一个改为指向前面的节点 /***************************

sinat_35297665的博客 703

普通人如何上岸华为OD-面试总结

总共有3道算法题,100分值的两道,200分值的一道,不同的毕业院校和专业,通过机试的分值不一样,最少需要150分通过,提前和hr联系,了解自己需要多少分通过。重中之重:哪怕你是背的题库,也请你一定不要直接抄原来的,最好是变更下方法名,否则会判定你重复率过高,从而失去后面的面试机会(实在是不会做再用此方法,凑分数所用,面试官能看到你的代码,会影响你的面试评价)本人女,所以还问道了婚育计划,有对象这点可以说,没有问题,但是如果可以的话,生孩子的时间,可以给hr说这几年不考虑。如果说没有难题,直接就挂了。

weixin_47767264的博客 5451

单链表的逆置(C++实现)

  单链表以及逆置是什么就不说了,就简单说一下思想: 链表的初始状态: 具体的方法就是将头节点后面的节点,依次通过指针指向,插入head头节点之后,即可完成逆置过程.  示意图(这里我写一下中间处理流程,因为这样比较直观.第一次的处理与正常处理雷同): 需要注意的主要有两点: 1. 逆置之后的链表的尾部要NULL.在这里就是刚开始的时候的pHead-&gt;next-&gt;next = nu...

Tattoo的博客 5176

最新小旋风蜘蛛池X6.21解密版+绕过授权带教程

介绍: 1.站群管理:用你的域名在这里添加网站 2.站点优化:站点互链,内容优化 2.系统设置:开启蜘蛛池 3.采集管理(可开启自动采集) 4.缓存设置:推荐开启tkd缓存 其他的用户根据自己的实际情况后台进行配置,通常以下: 1.后台首页(这里显示系统的大致概况) 2.系统设置:蜘蛛池的基本设置(访问开关、跳转、统计等等) 3.站群管理: 1.网站管理(用你的域名在这里添加网站) 2.模型管理(可构建不同类型站点:电影、文章、论坛等等) 3.TKDB调用模板(即:title、keywords、descri

百度SEO程序下载 2935

vue:npm安装pnpm报错,npm ERR! code ENOTFOUND,npm ERR! syscall getaddrinfo,npm ERR! errno ENOTFOUND详细排查解决!

vue2 vue3,npm install -g pnpm 安装出现错误,安装pnpm及解决安装失败问题,解决 npm无法安装pnpm问题,npm 安装 pnpm 时 报错 npm ERR! code ENOTFOUND,pnpm无法安装报错,vue npm install -g pnpm安装报错,request to http://registry.cnpmjs.org/pnpm failed, reason: getaddrinfo ENOTFOUND registry.cnpmjs.org,安装pnp

✅ 精选推荐文章 3608

C++用类实现单链表的元素首尾逆置

想实现单链表的元素逆置,但发现基本都是用结构体实现的,既然C++的特色就是面对对象,那么当然也能用面对对象来实现,于是参考了一些文章,做了一些优化并添加了注释,有问题的话可以留言

fengmi_youzi的博客 201

【XSRP软件无线电】基于软件无线电平台的QPSK频带通信系统设计(含有完整工程资料获取链接)

软件无线电(Software Defined Radio, SDR)是一种无线通信系统,它通过软件来定义和实现无线电的功能,而不是依赖于传统的硬件电路。SDR平台的核心思想是将传统无线电系统中的大部分硬件功能,如调制解调、信号处理、频率选择等,通过软件来实现。这种设计理念使得SDR具有高度的灵活性和可重配置性,能够适应不同的通信标准和频段,快速适应新的通信技术。

嵌入式技术开发 3280

单链表逆置,C++实现

问题描述:编写函数将单链表逆置,逆置过程中不允许创建新的单链表。 问题分析:由于不能创建新的单链表,于是只能在该单链表上边遍历边逆置。定义三个指针p,q,r,以p为遍历单链表的指针变量,让p指向一个结点,q指向其后的一个结点,r指向q之后的一个结点(r可以为空),如下图所示。接着让q结点原来指向r结点的指针现在指向p结点,再将p,q指向的结点向后移,如此循环达到逆置。 实现代码: #

小笨鸟高飞 1202

2025_NIPS_Grounded Reinforcement Learning for Visual Reasoning

尽管基于思维链的强化学习已在数学、编程等任务中显著提升语言模型性能,但视觉推理面临额外复杂性——需模型引导视觉注意力、解读感知输入,并将抽象推理锚定到空间证据上。本文提出ViGoRL(视觉接地强化学习),这是一种通过强化学习训练的视觉语言模型,能将每个推理步骤明确锚定到特定视觉坐标。受人类视觉决策启发,ViGoRL学会生成空间接地的推理轨迹,在每个步骤引导视觉注意力聚焦任务相关区域。当需要细粒度探索时,我们提出的多轮强化学习框架允许模型随着推理展开动态缩放至预测坐标。

c_cpp_csharp的专栏 58

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

算法如诗的博客 1298

C++编程实现单链表的逆置

实现一单链表的逆置,并输出逆置前后的结果。。。 写的简单一点,参考写法: #include using namespace std; typedef struct list { int data; struct list *next; ;}LIST; LIST * creat()//创建链表 { LIST *head,*p; int flag=1,d; head = n

junli_chen的博客 3815

ubuntu20.04搭建QGC4.2编译环境

QGC 4.2ubuntu18.04也可以编译QGC4.2,但是由于GLBC版本较低,无法使用最新版的QTCreator,Ubuntu20.04可以使用最新版QTCreator。

超维空间科技的博客 1万+

C++构建一张单链表,实现对单链表的插入、删除、求表长。将单链表逆置,并判断单链表是否递增有序

来自大二上学期实验报告1,请多指教。 一、实验任务: 构建一张单链表,实现对单链表的插入、删除、求表长。将单链表逆置,并判断单链表是否递增有序。 二、代码: template<class DataType> struct Node { DataType data; Node<DataType>* next; }; template<class DataType&g...

Frank_LLX的博客 1013

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: C 语言的若干问题(持续更新中)
下一篇: linux内核原子操作的实现
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值