对于单链表的逆置有两种方法可以实现:
(1)利用辅助指针
基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。
实现代码:
- typedefintDataType;//类型定义
- typedefstructnode{//单链表定义
- DataTypedata;
- structnode*next;
- }LinkedNode,*LinkList;
- voidReverseList(LinkList&ListHead)
- {
- cout<<"BegintoReversetheList"<<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;//记录下新的头结点
- }
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、返回值为空
- voidReverseList(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;
- }
- }
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<<"BegintoReversetheList"<<endl;
- if((NULL==pCur)||(NULL==pCur->next))
- {
- ListHead=pCur;
- returnpCur;
- }
- else
- {
- LinkedNode*pTemp=ReverseList(pCur->next,ListHead);//递归逆置后继结点
- pTemp->next=pCur;//将后继结点指向当前结点
- pCur->next=NULL;
- returnpCur;
- }
- }
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>
- usingnamespacestd;
- constintN=6;
- typedefintDataType;//类型定义
- typedefstructnode{//单链表
- DataTypedata;
- structnode*next;
- }LinkedNode,*LinkList;
- /****由数组创建单链表****/
- LinkListCreateList(DataTypea[N])
- {
- LinkedNode*ListHead=newLinkedNode();
- ListHead->data=a[0];
- ListHead->next=NULL;
- for(inti=N-1;i>=1;i--)
- {
- LinkedNode*p=newLinkedNode();
- p->data=a[i];
- p->next=ListHead->next;
- ListHead->next=p;
- }
- returnListHead;
- }
- /****输出单链表****/
- voidPrintList(LinkListListHead)
- {
- if(NULL==ListHead)cout<<"TheListisempty!"<<endl;
- else
- {
- LinkedNode*p=ListHead;
- while(p!=NULL)
- {
- cout<<p->data<<"";
- p=p->next;
- }
- cout<<endl;
- }
- }
- voidReverseList(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;
- }
- }
- intmain()
- {
- inta[N]={1,2,3,4,5,6};
- LinkedNode*list=CreateList(a);
- PrintList(list);
- LinkedNode*pTemp=list;
- ReverseList(pTemp,list);
- PrintList(list);
- return0;
- }
#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,ListHead); //递归逆置后继结点
pNext->next=pCur; //将后继结点指向当前结点。
pCur->next=NULL;
}
}
int main()
{
int a[N]={1,6};
LinkedNode* list=CreateList(a);
PrintList(list);
LinkedNode*pTemp=list;
ReverseList(pTemp,list);
PrintList(list);
return 0;
}
原文链接:https://www.f2er.com/javaschema/286577.html