单链表的逆置-C++实现
2012-05-28 21:43
267 查看
对于单链表的逆置有两种方法可以实现:
(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;
}
相关文章推荐
- 数据结构-链表逆置(c++模板类实现)
- 单链表的逆置-C++实现
- 左神的书——《程序员代码面试指南》之逆置单链表或双链表 c++实现
- c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
- 单链表的逆置-C++实现(转载)
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
- 逆置单链表,C++封装实现,经过测试。
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- 单链表的逆置-C++实现
- 如何用C++实现双向循环链表
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- test C++实现一个链表
- 链表java与c++实现
- C++实现队列--数组实现和链表实现
- C++实现链表函数
- [c++]链表实现--持续更。
- C++实现单链表(Singly-Linked List)追加、遍历、删除
- C++利用链表与模板实现栈
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果