关于链表逆置的递归和迭代方法
前一段日子收到cisco的面试,被问到一个问题,对一个单链表进行逆置,题目很简单,最近对递归有了一些新的认识,写下一些感想。
当你拿到一个可以用递归解决的问题时,别马上下手写程序,基本上这样都会失败,你需要停下来思考一下如何用数学表达式也形式化的写出
递归定义。
比如斐波那契数列,递归的数学表达式如下:
f(0)=1
f(1)=1
f(n)=f(n-1)+f(n-2)
有了如上的递归表达式,写递归就会很简单。
链表逆置也一样,如 1->2->3->4->5->null,
f(5)= return //返回逆置的链表头结点
f(其他) = <- //f(1)注意有所改变
代码如下:
Node* reverse(Node* p){
Node* head=p;
if(p->next == null)
return p;
else{
reverse(p->next);
p->next->next = p;
if(p == head)
head->next = null;
}
}
那么递归又如何转为迭代呢?又需要几个指针?
1->2->3->4->5->null
p=1,q=2,s=3
<-
1<-2 3->4->5
p=2,q=3,s=4
<-
1<-2<-3 4->5
p=3,q=4,s=5
<-
1<-2<-3<-4 5
p=4,q=5,s=null
<-
1<-2<-3<-4<-5
p=5
代码如下:
Node* reverse(Node* p){
Node* head = p;
Node* q = p->next;
Node* s = q->next;
while(p->next != null){
q->next = p;
p = q;
if(p->next != null){
q = s;
s = s->next;
}
}
return p;
}
迭代完美方案
prev=null,current=head,next=null
null->1->2->3->4->5->null
next=2
null<-1
pre=1,current=2
prev=1,current=2,next=2
null<-1 2->3->4->5->null
next=3
null<-1<-2
pre=2,current=3
prev=2,current=3,next=3
null<-1<-2<-3 4->5->null
next=4
null<-1<-2<-3<-4
pre=3,current=4,next=4
null<-1<-2<-3<-4 5->null
next=5
...........................
node* rev(node *head)
{
node *prev=NULL,*current=head,*next=NULL;
while(current)
{
next=current->next;
current->next=prev;
prev=current;
current=next;
}
return prev;
}
完美~~
转载于:https://www.cnblogs.com/GODYCA/archive/2012/12/27/2835185.html
关于链表逆置的递归和迭代方法相关推荐
- C语言 链表逆置四种方法 超详细
链表逆置 C语言 创建所需的相关结构体 struct List {int date;struct List* next; }; 首先我们创建一个函数用于创建链表的. 建立创建链表的函数 struct ...
- 单链表反转(逆置)——(四种方法实现)
链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个--依次类推,直到第一个到最后一个. 由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的 ...
- C语言实现不带头结点的单链表逆置的三种方法
C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...
- 带有头节点单链表,带有头节点单链表逆置的四种方法
文章目录 带头结点的单链表 单链表逆置的四种做法 带头结点的单链表 链式存储结构:逻辑上相邻的数据元素,并不要求物理上也相邻: 单链表的代码实现 .h文件 #pragma once typedef i ...
- 程序员面试题准备(1)单链表逆置
面试中程序测试,单链表的操作应该是比较容易出现的.单链表的一般操作,比如创建.遍历.插入.删除.清空等常规操作应该是必须掌握的操作,那么程序员面试中可能会出现"非常规"的链表操作, ...
- 6-4 链表逆置 (10 分)
** 6-4 链表逆置 (10 分) ** 本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头.链表结点定义如下: struct ListNode {int data;struct ...
- 借助于栈结构将一个单链表逆置
借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...
- 7-4 单链表基础应用(4)--单链表逆置
编程实现一个简易学生信息管理系统,按如下步骤分别用自定义函数实现: (1) 根据输入信息创建单链表并输出所有结点信息.每个学生的信息包括姓名和成绩: (2) 将上一步创建的单链表逆置后并输出所有结点信 ...
- 单链表逆置:空间复杂度O(1)
带头结点单链表逆置 从链表(带头结点)首个数据结点开始,重新头插法建表,将节点链接到头结点上 //单链表结点结构 typedef struct LNode {int data;struct LNode ...
最新文章
- springmvc前台String转后台Date
- 纸上谈兵: AVL树
- 手把手教你发布一个Python包
- python 解析xml 文件: SAX方式
- Java集合之Vector源码分析
- jQuery中append、appendTo、prepend、prependTo、before、insertBefore、after与insertAfter方法注意事项...
- 14 MySQL--事务函数与流程控制
- yum报[Errno 256] No more mirrors to try
- 9道微服务面试题,你能回答上来几个?
- simulink中积分环节、惯性环节、比例环节
- BFS 算法框架套路详解
- 2019春 总结作业
- 关于计算机团队名字大全集,有创意的团队名字大全 新颖而有内涵团队名字
- l2范数求导_向量的L2范数求导
- 达索系统3DEXPERIENCE 平台应用程序组件
- SIP-sipp的使用
- Java开发微信公众号-接口测试帐号接口配置及Java源代码
- 压测--部署jp@gc - PerfMon Metrics Collector
- 小学期助教感受-Funcode游戏编程
- SSM毕设项目游泳馆管理系统851a0(java+VUE+Mybatis+Maven+Mysql)