单链表的逆置-C++实现(ok)
(1)利用辅助指针
基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。
实现代码:
- typedef int DataType; //类型定义
- typedef struct node{ //单链表定义
- DataType data;
- struct node* next;
- }LinkedNode,*LinkList;
- void ReverseList(LinkList& ListHead)
- {
- cout<<"Begin to Reverse the List"<<endl;
- if( (NULL==ListHead)||(NULL==ListHead->next) )return ; //边界检测
- LinkedNode* pPre=ListHead; //先前指针
- LinkedNode* pCur=pPre->next; //当前指针
- LinkedNode* pNext=NULL; //后继指针
- while(pCur!=NULL)
- {
- pNext=pCur->next;
- pCur->next=pPre;
- pPre=pCur;
- pCur=pNext;
- }
- ListHead->next=NULL;
- ListHead=pPre; //记录下新的头结点
- }
示意图:
(2)递归
基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。
实现代码:
写了两个版本
I、返回值为空
[cpp] view plaincopy print?
- void ReverseList(LinkedNode* pCur,LinkList& ListHead)
- {
- if( (NULL==pCur)||(NULL==pCur->next) )
- {
- ListHead=pCur;
- }
- else
- {
- LinkedNode* pNext=pCur->next;
- ReverseList(pNext,ListHead); //递归逆置后继结点
- pNext->next=pCur; //将后继结点指向当前结点。
- pCur->next=NULL;
- }
- }
II、返回值为结点类型
[cpp] view plaincopy print?
- LinkedNode* ReverseList(LinkedNode* pCur,LinkList& ListHead)
- {
- cout<<"Begin to Reverse the List"<<endl;
- if( (NULL==pCur)||(NULL==pCur->next) )
- {
- ListHead=pCur;
- return pCur;
- }
- else
- {
- LinkedNode* pTemp=ReverseList(pCur->next,ListHead); //递归逆置后继结点
- pTemp->next=pCur; //将后继结点指向当前结点
- pCur->next=NULL;
- return pCur;
- }
- }
示意图:
下面给出完整的程序:
- #include<iostream>
- using namespace std;
- const int N=6;
- typedef int DataType;//类型定义
- typedef struct node{ //单链表
- DataType data;
- struct node* next;
- }LinkedNode,*LinkList;
- /****由数组创建单链表****/
- LinkList CreateList(DataType a[N])
- {
- LinkedNode* ListHead=new LinkedNode();
- ListHead->data=a[0];
- ListHead->next=NULL;
- for(int i=N-1;i>=1;i--)
- {
- LinkedNode* p=new LinkedNode();
- p->data=a[i];
- p->next=ListHead->next;
- ListHead->next=p;
- }
- return ListHead;
- }
- /****输出单链表****/
- void PrintList(LinkList ListHead)
- {
- if(NULL==ListHead)cout<<"The List is empty!"<<endl;
- else
- {
- LinkedNode* p=ListHead;
- while(p!=NULL)
- {
- cout<<p->data<<" ";
- p=p->next;
- }
- cout<<endl;
- }
- }
- void ReverseList(LinkedNode* pCur,LinkList& ListHead)
- {
- if( (NULL==pCur)||(NULL==pCur->next) )
- {
- ListHead=pCur;
- }
- else
- {
- LinkedNode* pNext=pCur->next;
- ReverseList(pNext,ListHead); //递归逆置后继结点
- pNext->next=pCur; //将后继结点指向当前结点。
- pCur->next=NULL;
- }
- }
- int main()
- {
- int a[N]={1,2,3,4,5,6};
- LinkedNode* list=CreateList(a);
- PrintList(list);
- LinkedNode*pTemp=list;
- ReverseList(pTemp,list);
- PrintList(list);
- return 0;
- }
单链表的逆置-C++实现(ok)相关推荐
- C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决. 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...
- 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增 删 插 查 改. #include #include #include #i ...
- 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表
## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
<(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...
- 有头结点单链表的逆置
[问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...
- (二十四) 单链表的逆置(java)
前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧. 参考博客:点击打开链接 demo地址:我的github 1. 单链表 先写一个简单的单链表,改写一下它的toS ...
- 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)
今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...
- java实现单链表就地逆置,单链表的就地逆置讲解
{ List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...
- java实现单链表就地逆置,20. 微软面试题:单链表就地逆放
题目是:链表操作,单链表就地逆置 分析: 这题只需要设置三个指针就搞定了,ListNode* p 表示当前指针, ListNode* fp: 上一个节点指针, ListNode * ep :下一个节点 ...
最新文章
- ActionDescriptor 的认识
- 字节跳动面试题:“请你描述下 Spring Bean 的生命周期?”
- 第十一章 串 (b2)蛮力匹配
- v3s 全志_基于全志V3s的开源开发板,提供pcb和系统源码和资料
- excel表头_如何用Excel制作出库入库表
- ASP.NET Core File Providers
- 最强动画制作人书包_声优访谈丨恋与制作人动画中配声优访谈——夏磊
- MacOS emacs Command “pyls“ is not present on the path.报错及解决
- 判断点是否在一个矩形内
- php mysql 读写删改_PHP+MYSQL实现用户的增删改查
- 如何使用Java逐行读取大文本文件?
- 移动100m宽带慢的要死_【今日小知识】卡吗?慢吗?移动千兆路由器带你飞
- 文件查找命令 - find
- 虚拟机 Debian 11 安装moodle3.11
- 360Hbase二级索引
- php 用户控件,一个使用用户控件(包括组件)的演示-.NET教程,组件控件开发
- html5 五线谱,五线谱难学?5分钟完成五线谱入门
- 微信小程序自定义组件使用阿里矢量图标库图标
- 大数据分析-考试复习
- win7系统安装信息服务器不可用怎么办,Win7系统RPC服务器不可用怎么办?