(转)单链表的逆置
2014-07-02 16:40
190 查看
对于单链表的逆置有两种方法可以实现:
(1)利用辅助指针
基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。
实现代码:
示意图:
(2)递归
基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。
实现代码
写了两个版本
I 返回值为空
II、返回值为结点类型
示意图:
下面给出完整的程序:
(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 ) { 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 ={1,2,3,4,5,6}; LinkedNode* list=CreateList(a); PrintList(list); LinkedNode*pTemp=list; ReverseList(pTemp,list); PrintList(list); return 0; }
相关文章推荐
- 实现一个单链表的建立、测长、打印,插入,排序,逆置
- 将单链表H逆置
- 第1章第2节练习题11 就地逆置单链表
- 课程【单链表的部分逆置】
- 第四周项目3(1)-单链表应用 逆置单链表
- 单链表的建立,插入,删除,逆置
- 单链表的就地逆置 (单链表带头结点)(某公司校园招聘面试试题)
- OJ-单链表的逆置
- 设计一代码,逆置带头结点的动态单链表L
- C语言实现单链表的逆置
- 数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!
- 单链表就地逆置
- 线性表之顺序表奇偶调整和单链表就地逆置
- Java数据结构-线性表之单链表应用-单链表的逆置
- 第4周 项目3-单链表:逆置、连接与递增判断
- 第四周单链表的应用(1)——逆置
- 单链表的的逆置(带头结点)
- 线性表的应用3(单链表的基本实现和逆置)
- 单链表的增删查 逆置 倒数第k个节点等问题
- 单链表的就地逆置.