链表逆序输出(递归妙)
2013-12-25 15:26
155 查看
四种方式实现--从尾到头输出链表
方法一:借用栈倒序输出链表
方法二:先翻转链表,再顺序输出
方法三:递归实现,一个字妙,两个字很妙,三个字太妙了
方法四:用数组实现
方法一:借用栈倒序输出链表
因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈
方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了)
翻转链表的步骤:
1:将当前节点的next节点指向他以前的前一个节点
2:当前节点下移一位
3:如果是最后一个节点,就把它的next节点指向它以前的前一个节点,并推出循环
方法三:用递归实现
很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理
正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。
方法四:借用数组实现,跟用栈实现的方式差不多,
LoveJenny说的实现方式跟这种方式是一样的,空间复杂度都是O(n)
源码
方法一:借用栈倒序输出链表
方法二:先翻转链表,再顺序输出
方法三:递归实现,一个字妙,两个字很妙,三个字太妙了
方法四:用数组实现
方法一:借用栈倒序输出链表
因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈
方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了)
翻转链表的步骤:
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
相关文章推荐
- C语言 逆序输出单链表(递归)
- 链表递归逆序输出和反转链表。
- 递归逆序输出链表
- 链表逆序输出(递归妙)
- 链表逆序输出(递归妙)
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
- 通过迭代(非递归)及递归将单链表逆序
- [记着玩]java模拟链表逆序输出结果
- C++ 递归和非递归实现链表逆序
- 链表面试题--两种方法逆序打印单链表(栈和递归)
- 用递归实现链表逆序
- 华为机试—逆序链表输出
- 【数据结构】-线性表-链表 熟练度max=6(利用递归倒序输出L中的值域)
- 递归倒序输出链表
- 链表的逆序输出
- 链表的逆序输出 递归算法
- 逆序输出字符串(递归实现)
- 华为机试题:删除链表中的重复节点、剩余节点逆序输出
- java实现递归将数组逆序输出
- 怎样非递归逆序输出整数---------这个方法不知好不好,高手路过请指点,谢谢!