您的位置:首页 > 其它

链表逆序输出(递归妙)

2013-12-25 15:26 155 查看
四种方式实现--从尾到头输出链表

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

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

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

  方法四:用数组实现

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

     因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈

  方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了)

翻转链表的步骤:

1:将当前节点的next节点指向他以前的前一个节点

2:当前节点下移一位

3:如果是最后一个节点,就把它的next节点指向它以前的前一个节点,并推出循环

  方法三:用递归实现

很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理

正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。

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




源码

//三种方式实现--从尾到头输出链表
#include<stack>
#include<string>
#include<iostream>
usingnamespacestd;

classOutFromEnd
{
public:
typedefstructnode1
{
intdata;
node1*next;
node1(intd):data(d),next(NULL){}
}node;

OutFromEnd()
{
head=cur=newnode(-1);
}

voidadd(intdata)
{
node*tmp=newnode(data);
cur->next=tmp;
cur=tmp;
}

//借用栈倒序输出链表
//因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈
voidstackMethod()
{
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();
}
}


voidreverse()
{
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;
}
}

voidprint3()
{
recursion(head->next);
}

//用递归实现
//很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理
//正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。
voidrecursion(node*head)
{
if(NULL==head)
{
return;
}

if(head->next!=NULL)
{
recursion(head->next);
}

//如果把这句放在第二个if前面,那就是从头到尾输出链表,曾经的你或许是用while或者用for循环输出链表,现在你又多了一种方式
cout<<head->data<<"\t";
}

//借用数组实现
voidprint4()
{
node*tmp=head->next;
intlen=0;
while(tmp!=NULL)
{
++len;
tmp=tmp->next;
}
tmp=head->next;
int*A=newint[len];
for(inti=len-1;i>=0;i--)
{
A[i]=tmp->data;
tmp=tmp->next;
}

for(inti=0;i<len;i++)
{
cout<<A[i]<<"\t";
}
delete[]A;
}


private:
node*head,*cur;
};


转自:http://blog.sina.com.cn/s/blog_68e4d2910100tc0i.html


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: