前一段日子收到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

关于链表逆置的递归和迭代方法相关推荐

  1. C语言 链表逆置四种方法 超详细

    链表逆置 C语言 创建所需的相关结构体 struct List {int date;struct List* next; }; 首先我们创建一个函数用于创建链表的. 建立创建链表的函数 struct ...

  2. 单链表反转(逆置)——(四种方法实现)

    链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个--依次类推,直到第一个到最后一个. 由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的 ...

  3. C语言实现不带头结点的单链表逆置的三种方法

    C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...

  4. 带有头节点单链表,带有头节点单链表逆置的四种方法

    文章目录 带头结点的单链表 单链表逆置的四种做法 带头结点的单链表 链式存储结构:逻辑上相邻的数据元素,并不要求物理上也相邻: 单链表的代码实现 .h文件 #pragma once typedef i ...

  5. 程序员面试题准备(1)单链表逆置

    面试中程序测试,单链表的操作应该是比较容易出现的.单链表的一般操作,比如创建.遍历.插入.删除.清空等常规操作应该是必须掌握的操作,那么程序员面试中可能会出现"非常规"的链表操作, ...

  6. 6-4 链表逆置 (10 分)

    ** 6-4 链表逆置 (10 分) ** 本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头.链表结点定义如下: struct ListNode {int data;struct ...

  7. 借助于栈结构将一个单链表逆置

    借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...

  8. 7-4 单链表基础应用(4)--单链表逆置

    编程实现一个简易学生信息管理系统,按如下步骤分别用自定义函数实现: (1) 根据输入信息创建单链表并输出所有结点信息.每个学生的信息包括姓名和成绩: (2) 将上一步创建的单链表逆置后并输出所有结点信 ...

  9. 单链表逆置:空间复杂度O(1)

    带头结点单链表逆置 从链表(带头结点)首个数据结点开始,重新头插法建表,将节点链接到头结点上 //单链表结点结构 typedef struct LNode {int data;struct LNode ...

最新文章

  1. OpenCV(项目)二维码识别(二维码、条形码)
  2. zabbix安装--LAMP环境下
  3. 地区省份城市sql信息
  4. 吴恩达深度学习课程deeplearning.ai课程作业:Class 2 Week 1 3.Gradient Checking
  5. 杂项题的基本解题思路——2、图片隐写术
  6. Stream流中的常用方法_forEach
  7. elasticsearch -- head插件
  8. Win32ASM学习[17]:条件跳转
  9. Java语言与sikuli配合
  10. Python四大金刚之一:列表
  11. Python自动化二--jmeter分布式测试,抓包,python语法基本介绍
  12. __declspec《转》
  13. 【高速PCB电路设计】2.高速电路DDR原理图概述
  14. 15.3,python中扫描条形码和二维码
  15. Android11 图片裁剪问题
  16. EXCEL装逼指南之动态进度条(项目经理必备技能)
  17. 将本机文件复制到安装的虚拟机系统中的两种方法
  18. stm32f103移植ucosIII系统
  19. 使用npm下载包,报错 error An unexpected error occurred: “EPERM: operation not permitted
  20. 知识图谱——领域知识问答系统简单介绍

热门文章

  1. Winform中ComcoBox控件设置选定项
  2. Purus系统常见使用问题及解决方式FAQ 1
  3. 浏览器本地存储(cookie、sessionStorage和localStorage)
  4. 实现两边定宽,中间自适应布局(三栏布局)的七种方法
  5. Web存储—本地存储Cookie
  6. 【Express】—Express路由请求
  7. 你为什么选择考研,考研对你的意义是什么?
  8. 职场中混日子的人都有这几种习惯
  9. 人到中年,别再挥霍你的“同情心”了
  10. 挣钱难,做老板不易,特别是种植老板