3、单链表反转
题目:单链表反转
分析:
1、迭代法:在遍历结点过程中,先逆置先前结点和当前结点,然后再将当前结点和后继结点前移后再逆置,这样依次下去。
2、递归法:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。
//单链表反转
#include<iostream>
using namespace std;
typedef struct node
{
int data;
node *next;
}linklist;
linklist *head=NULL;
//创建单链表
linklist* CreateList(int* arr,int len)
{
int data;
linklist* pCur,* pRear;
head=(linklist*)malloc(sizeof(linklist));
pRear=head;
int count=0;
while(count<len)
{
pCur=(linklist*)malloc(sizeof(linklist));
pCur->data=arr[count];
pRear->next=pCur;
pRear=pCur;
count++;
}
pRear->next=NULL;
return head;
}
//显示链表
void ShowList(linklist* p)
{
while(p)
{
cout<<p->data <<' ';
p=p->next;
}
cout << endl;
}
/************************链表反转************************************************/
//迭代法
linklist* Reverse(linklist* p)
{
if(p==NULL || p->next==NULL)
return p;
linklist* pPre,*pCur,*pNext;
pPre=p;
pCur=pPre->next;
while(pCur)
{
pNext=pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
}
p->next=NULL;
p=pPre;
return p;
}
//递归法
void ReverseList(linklist* p,linklist* &head)
{
if(p==NULL || p->next==NULL)
{
head=p;
}
else
{
linklist* pNext=p->next;
ReverseList(pNext,head);
pNext->next=p;
p->next=NULL;
}
}
int main()
{
int a[]={3,4,5,1,2,-1,7};
CreateList(a,sizeof(a)/sizeof(a[0]));
ShowList(head->next);
//ShowList(Reverse(head->next));
ReverseList(head->next,head);
ShowList(head);
return 0;
}