单链表的逆序实现,递归和非递归算法
2014-03-20 20:39
274 查看
这个也是很常见的面试题目。
刚开始见过,开了一下别人写的以为理解了,让我自己写,我才发现原来里面的细节是很多的,可以说,你也许大概懂算法在干什么,可是,你若如果不注意细节,根本体会不到算法里面的每一行的意思,今天就是看了别人一个算法,被误导了,怎么都没理解他的意思。结果看了10几篇,果然他里面漏了点东西,引导我越陷月深,所以,非要弄清楚,看了好多人写的东西。
我只能说都大致相同,可是有很多细节都没注意到,一看就是粘贴过来的,里面的没思考。为了不误导大家,这里贴下两种算法。
非递归算法,你只要理解整个过程怎么一个一个断开,一个一个链接起来的,就还算法容易理解
而递归算法,我只能说,你不画一个递归树图,你根本反应不过来在干什么,我也是看了很多人写的,内容,图解分析才明白的。如下:
简单补充几句,非递归
p1记录当前节点的前一个节点上是什么?
p2就是当前节点,最后一个节点,也就是最后逆序以后的头结点。
p3结点用来保存p2结点的下一个节点关系的中间变量。
大概过程就是,断开后面的节点,连接到前面,直到最后一个,他的最后为null,就返回了。
注意对于head头结点的处理,直接让他的next为null了,这里最好有个图,就更能很好的理解了。
递归
对于递归真的比较巧妙了,递归的思想。
别问我啥是递归的思想
利用2个节点p,q(之前一直没明白p是个什么的?)
p其实记录的就是第一个节点的信息,q则就是递归以后的最后一个节点。
这里要处理head结点,为什么?自己思考
第一个节点p要反链接到head头结点上面
最后处理head结点为null
如果,你真的明白这个过程,那么递归就理解的比较深入了。
刚开始见过,开了一下别人写的以为理解了,让我自己写,我才发现原来里面的细节是很多的,可以说,你也许大概懂算法在干什么,可是,你若如果不注意细节,根本体会不到算法里面的每一行的意思,今天就是看了别人一个算法,被误导了,怎么都没理解他的意思。结果看了10几篇,果然他里面漏了点东西,引导我越陷月深,所以,非要弄清楚,看了好多人写的东西。
我只能说都大致相同,可是有很多细节都没注意到,一看就是粘贴过来的,里面的没思考。为了不误导大家,这里贴下两种算法。
非递归算法,你只要理解整个过程怎么一个一个断开,一个一个链接起来的,就还算法容易理解
而递归算法,我只能说,你不画一个递归树图,你根本反应不过来在干什么,我也是看了很多人写的,内容,图解分析才明白的。如下:
class Test4{ class Node{ int value; Node next; } Node reverse(Node head){ if(head==null||head.next==null)return head; Node p1,p2,p3; p1=head; p2=head.next; head.next=null; while(p2!=null){ p3=p2.next; p2.next=p1; p1=p2; p2=p3; } return p2; } Node reverseWithRecursive(Node head){ if(head==null||head.next==null)return head; Node p,q; p=head.next; q=reverseWithRecursive(head.next); p.next=head; head.next=null; return q; } }
简单补充几句,非递归
p1记录当前节点的前一个节点上是什么?
p2就是当前节点,最后一个节点,也就是最后逆序以后的头结点。
p3结点用来保存p2结点的下一个节点关系的中间变量。
大概过程就是,断开后面的节点,连接到前面,直到最后一个,他的最后为null,就返回了。
注意对于head头结点的处理,直接让他的next为null了,这里最好有个图,就更能很好的理解了。
递归
对于递归真的比较巧妙了,递归的思想。
别问我啥是递归的思想
利用2个节点p,q(之前一直没明白p是个什么的?)
p其实记录的就是第一个节点的信息,q则就是递归以后的最后一个节点。
这里要处理head结点,为什么?自己思考
第一个节点p要反链接到head头结点上面
最后处理head结点为null
如果,你真的明白这个过程,那么递归就理解的比较深入了。
相关文章推荐
- 单链表逆序———不借助外部辅助空间递归与非递归实现
- 递归逆序打印单链表(c实现)
- 递归和非递归实现单链表的转置。
- Java实现折半查找(二分查找)的递归和非递归算法
- 算法设计和数据结构学习_8(单链表的递归逆序)
- 每日一个算法------二叉树实现、递归和非递归算法(c++版)
- 二叉树前序、中序、后序遍历的递归与非递归算法实现
- Java实现折半查找(二分查找)的递归和非递归算法
- C语言习题5.19--递归方法实现逆序
- java实现递归将数组逆序输出
- 用递归实现链表逆序
- Problem A: C语言习题5.19--递归方法实现逆序
- java 实现单链表的逆序
- 单链表逆序(c实现)
- 将一个整数逆序输出,分别给出递归和非递归算法
- [置顶] 单链表反转的递归与非递归实现
- 单链表的反转(用循环和递归实现单链表反转)
- 递归方法实现逆序
- 递归实现字符串的逆序
- 实现栈的逆序 递归 不申请额外的数据结构