题目:将不带头结点的单链表逆序。
递归写法:
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L){//不带头结点的单链表
L=NULL;
}
void PrintList(LinkList L){
LNode *p=L;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
LinkList reverseList(LinkList L){
if(L==NULL||L->next==NULL){
return L;
}
LinkList result=reverseList(L->next);
L->next->next=L;
L->next=NULL;
return result;
}
int main(){
LinkList L;
InitList(L);
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=1;
s->next=NULL;
L=s;
LNode *p=s;
for(int i=2;i<=10;i++){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=i;
s->next=NULL;
p->next=s;
p=s;
}
cout<<"逆序前:"<<endl;
PrintList(L);
cout<<"逆序后:"<<endl;
LinkList L1;
InitList(L1);
L1=reverseList(L);
PrintList(L1);
return 0;
}
非递归写法:
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L){//不带头结点的单链表
L=NULL;
}
void PrintList(LinkList L){
LNode *p=L;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//LinkList reverseList(LinkList L){
// if(L==NULL||L->next==NULL){
// return L;
// }
// LinkList result=reverseList(L->next);
// L->next->next=L;
// L->next=NULL;
// return result;
//}
//非递归写法
LinkList reverseList(LinkList L){
LNode *prev=NULL;
LNode *cur=L;
LNode *next=NULL;
while(cur!=NULL){
next=cur->next;
cur->next=prev;
prev=cur;
cur=next;
}
return prev;
}
int main(){
LinkList L;
InitList(L);
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=1;
s->next=NULL;
L=s;
LNode *p=s;
for(int i=2;i<=10;i++){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=i;
s->next=NULL;
p->next=s;
p=s;
}
cout<<"逆序前:"<<endl;
PrintList(L);
cout<<"逆序后:"<<endl;
LinkList L1;
InitList(L1);
L1=reverseList(L);
PrintList(L1);
return 0;
}