两种方法求单链表逆序

来源:互联网 发布:mac地址绑定错误 编辑:程序博客网 时间:2024/09/21 08:19

1 递归,很简单

代码:

#include<iostream>  using namespace std;  typedef struct node{int data;struct node * pNext;}Node ,*pNode;void createNode(pNode & pHead){int temp;scanf("%d",&temp);pNode p,q;bool isFirst = true;while(temp){if(isFirst){p=q=pHead=(pNode)malloc(sizeof(Node));pHead->data = temp;isFirst = false;}else{q = new Node();q->data = temp;q->pNext=NULL;p->pNext = q;p =q;}scanf("%d",&temp);}}void print(pNode pHead){if(pHead){cout<<pHead->data<<" ";print(pHead->pNext);}elsereturn;}void reverse(pNode pcur,pNode & pHead){if((NULL == pcur) ||( NULL == pcur->pNext)){pHead = pcur;return;}else{pNode pnext = pcur->pNext;reverse(pnext,pHead);pnext->pNext = pcur;pcur->pNext = NULL;}}int main()  {  pNode pHead = NULL;createNode(pHead);cout<<"原链表:"<<endl;print(pHead);cout<<"翻转:"<<endl;reverse(pHead,pHead);print(pHead);    return 0;  }  

运行结果:


2 不是递归,循环:

#include<iostream>  using namespace std;  typedef struct node{int data;struct node * pNext;}Node ,*pNode;void createNode(pNode & pHead){int temp;scanf("%d",&temp);pNode p,q;bool isFirst = true;while(temp){if(isFirst){p=q=pHead=(pNode)malloc(sizeof(Node));pHead->data = temp;isFirst = false;}else{q = new Node();q->data = temp;q->pNext=NULL;p->pNext = q;p =q;}scanf("%d",&temp);}}void print(pNode pHead){if(pHead){cout<<pHead->data<<" ";print(pHead->pNext);}elsereturn;}pNode reverse(pNode & pHead){if(NULL == pHead || NULL == pHead->pNext){return pHead;}pNode p1,p2,p3;p1=pHead;p2=pHead->pNext;while(p2){p3=p2->pNext;p2->pNext = p1;p1 = p2;p2 = p3;}pHead->pNext = NULL; /*设置链表尾*/pHead = p1;  /*调整链表头*/return pHead;}int main()  {  pNode pHead = NULL;createNode(pHead);cout<<"原链表:"<<endl;print(pHead);cout<<"翻转:"<<endl;reverse(pHead);print(pHead);    return 0;  }  

运行结果:



0 0
原创粉丝点击