单链表的逆置-C++实现
来源:互联网 发布:算法algorithm下载 编辑:程序博客网 时间:2024/05/29 11:44
转自:http://blog.csdn.net/heyabo/article/details/7610732
对于单链表的逆置有两种方法可以实现:
(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语言实现
- Live555中重要对象的生命期
- 驱动模型对象
- Oracle OS认证与口令文件认证详解
- 各种无线加密方式
- android完全退出程序(android退出有多个activity的应用)
- 单链表的逆置-C++实现
- 机房收费系统—总结
- NoSql的接口与交互
- 注册表更改远程桌面默认端口号3389为其他端口号 及系统服务是否打开
- 动态规划_最优二分查找树
- 位数问题
- Visual Studio 2010中C++项目升级指南
- Arrays工具类十大常用方法
- 【伸展树篇】正常向的伸展树