链表逆序输出(递归妙)

四种方式实现--从尾到头输出链表

  方法一:借用栈倒序输出链表

  方法二:先翻转链表,再顺序输出

  方法三:递归实现,一个字妙,两个字很妙,三个字太妙了

  方法四:用数组实现

  方法一:借用栈倒序输出链表
       因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈

  方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了)
                 翻转链表的步骤:
                      1:将当前节点的next节点指向他以前的前一个节点
                      2:当前节点下移一位
                      3:如果是最后一个节点,就把它的next节点指向它以前的前一个节点,并推出循环

  方法三:用递归实现
                 很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理
                 正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。

  方法四:借用数组实现,跟用栈实现的方式差不多, LoveJenny说的实现方式跟这种方式是一样的,空间复杂度都是O(n)

链表逆序输出(递归妙) 链表逆序输出(递归妙) 源码
//三种方式实现--从尾到头输出链表
#include <stack>
 #include <string>
 #include <iostream>
using namespace std;
 
class OutFromEnd
{
 public:
typedef struct node1
{
 int data;
node1* next;
node1(int d):data(d),next(NULL){}
} node;
 
OutFromEnd()
{
head=cur=new node(-1);
}
 
 void add(int data)
{
node* tmp=new node(data);
cur->next=tmp;
cur=tmp;
}
 
 //借用栈倒序输出链表
 //因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈
 void stackMethod()
{
 if(NULL==head || NULL==head->next)
{
 return;
}
 
node* tmp=head->next;
stack<int> s;
 
 while(tmp!=NULL)
{
s.push(tmp->data);
tmp=tmp->next;
}
 
 while(!s.empty())
{
cout<<s.top()<<"\t";
s.pop();
}
}
 
 
  void reverse()
{
 if(NULL==head || NULL==head->next)
{
 return;
}
cur=head->next;
 
node* prev=NULL;
node* pcur=head->next;
node* next;
 while(pcur!=NULL)
{
 if(pcur->next==NULL)
{
pcur->next=prev;
 break;
}
next=pcur->next;
pcur->next=prev;
prev=pcur;
pcur=next;
}
 
head->next=pcur;
 
node* tmp=head->next;
 while(tmp!=NULL)
{
cout<<tmp->data<<"\t";
tmp=tmp->next;
}
}
 
 void print3()
{
recursion(head->next);
}
 
 //用递归实现
 //很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理
 //正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。
 void recursion(node* head)
{
 if(NULL==head)
{
 return;
}
 
 if(head->next!=NULL)
{
recursion(head->next);
}
 
 //如果把这句放在第二个if前面,那就是从头到尾输出链表,曾经的你或许是用while或者用for循环输出链表,现在你又多了一种方式
cout<<head->data<<"\t";
}
 
 //借用数组实现
 void print4()
{
node* tmp=head->next;
 int len=0;
 while(tmp!=NULL)
{
 ++len;
tmp=tmp->next;
}
tmp=head->next;
 int* A=new int[len] ;
 for(int i=len-1;i>=0;i--)
{
A[i]=tmp->data;
tmp=tmp->next;
}
 
 for(int i=0;i<len;i++)
{
cout<<A[i]<<"\t";
}
delete [] A;
}
 
 
 private :
node *head,*cur;
}; 
 
转自:http://blog.sina.com.cn/s/blog_68e4d2910100tc0i.html
 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值