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;
}