单链表的逆置-C++实现
来源:互联网 发布:办公文件软件 编辑:程序博客网 时间:2024/05/18 02:53
对于单链表的逆置有两种方法可以实现:
(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、返回值为空
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、返回值为结点类型
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语言实现单链表的逆置
- 单链表的C实现
- 【C++】单链表的实现
- 单链表的C实现
- 【C++】单链表的实现
- c语言实现数组的逆置
- 单链表的C语言实现
- 单链表的反转实现(C++)
- 单链表的C语言实现
- 简单的单链表实现 c
- c语言单链表的实现
- C++|单链表的实现源代码
- 单链表C语言的实现
- 单链表的C语言实现
- C语言单链表的实现
- 【C语言】单链表的实现
- [c语言]单链表的实现
- 单链表的C语言实现
- 设计模式—— 观察者模式
- SFS&Android——Android例程调试
- page94
- 在unix系统中创建守护进程
- Vs2005 "正在更新 IntelliSense"无法通过的解决办法
- 单链表的逆置-C++实现
- Pwlib编译
- Linux驱动加载顺序
- Android NDK学习记录
- 专注的艺术 From36kr
- linux下解决dr.com客户端无法上网
- VC++实现DLL注入
- oralce -- 数据库管理工具出现的oci.dll问题
- 一个让printf不正常工作的例子 - 已解决