当前位置:   article > 正文

单链表逆置(头插法,递归,数据结构栈的应用)

单链表逆置(头插法,递归,数据结构栈的应用)

链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个……依次类推,直到第一个到最后一个。
由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的链表来实现逆置。

第一种——头插法

算法思想:逆置链表,初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。

代码实现:

  1. #include<iostream>
  2. using namespace std;//单链表逆置
  3. typedef int type;
  4. typedef struct link{
  5. type data;
  6. struct link *next;
  7. }link,*list;
  8. int main(){
  9. list head=new link;
  10. head->next=NULL;
  11. link *p,*r=head;
  12. int x;
  13. cout<<"请决定为单链表输入几个数值: ";
  14. cin>>x;
  15. for(int i=0;i<x;i++){
  16. p=new link;
  17. cout<<"请输入第"<<i+1<<"个数值:";
  18. cin>>p->data;
  19. p->next=r->next;
  20. r->next=p;
  21. r=p;
  22. }
  23. cout<<"单链表的内容为: ";
  24. p=head->next;
  25. for(int i=0;i<x;i++){
  26. cout<<p->data<<" ";
  27. p=p->next;
  28. }
  29. link *q;
  30. p=head->next;
  31. head->next=NULL;
  32. while(p!=NULL){
  33. q=p;
  34. p=p->next;
  35. q->next=head->next;
  36. head->next=q;
  37. }
  38. cout<<endl<<"单链表的内容为: ";
  39. p=head->next;
  40. for(int i=0;i<x;i++){
  41. cout<<p->data<<" ";
  42. p=p->next;
  43. }
  44. return 0;
  45. }

运行结果:

第二种——递归

代码实现:

  1. #include<iostream>
  2. using namespace std;//单链表逆置
  3. typedef int type;
  4. typedef struct link{
  5. type data;
  6. struct link *next;
  7. }link,*list;
  8. link* traverse(list head);
  9. int main(){
  10. link *p,*r,*head;
  11. int x;
  12. cout<<"请决定为单链表输入几个数值: ";
  13. cin>>x;
  14. p=new link;
  15. cout<<"请输入第"<<1<<"个数值:";
  16. cin>>p->data;
  17. p->next=NULL;
  18. head=p;
  19. r=head;
  20. for(int i=1;i<x;i++){
  21. p=new link;
  22. cout<<"请输入第"<<i+1<<"个数值:";
  23. cin>>p->data;
  24. p->next=r->next;
  25. r->next=p;
  26. r=p;
  27. }
  28. cout<<"单链表的内容为: ";
  29. p=head;
  30. for(int i=0;i<x;i++){
  31. cout<<p->data<<" ";
  32. p=p->next;
  33. }
  34. head=traverse(head);
  35. cout<<endl<<"单链表的内容为: ";
  36. p=head;
  37. for(int i=0;i<x;i++){
  38. cout<<p->data<<" ";
  39. p=p->next;
  40. }
  41. return 0;
  42. }
  43. link* traverse(list head){
  44. if(head->next==NULL){
  45. return head;
  46. }
  47. link *p=traverse(head->next);
  48. head->next->next=head;
  49. head->next=NULL;
  50. return p;
  51. }

运行结果:
第三种——利用栈存储结构

  1. #include<iostream>
  2. using namespace std;//单链表逆置
  3. typedef int type;
  4. typedef struct link{
  5. int data;
  6. struct link *next;
  7. }link,*list;
  8. int main(){
  9. list s=NULL;
  10. link *p;
  11. int x;
  12. int *a=new int[100];
  13. cout<<"请决定为单链表输入几个数值: ";
  14. cin>>x;
  15. for(int i=0;i<x;i++){
  16. p=new link;
  17. cout<<"请输入第"<<i+1<<"个数值:";
  18. cin>>p->data;
  19. a[i]=p->data;
  20. p->next=s;
  21. s=p;
  22. }
  23. cout<<"单链表的内容为: ";
  24. for(int i=0;i<x;i++){
  25. cout<<a[i]<<" ";
  26. }
  27. cout<<endl<<"逆置后单链表的内容为: ";
  28. for(int i=0;i<x;i++){
  29. p=s;
  30. cout<<p->data<<" ";
  31. s=s->next;
  32. delete p;
  33. }
  34. return 0;
  35. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/474466
推荐阅读
相关标签
  

闽ICP备14008679号