1.实现一个链表的逆置
- 方法一:尾插逆置,用两个指针,q,r,r用于标记原来链表的末尾,q用于标记尾插后的结点,每次将头结点的下一个结点尾插到链表结尾,直到L的下一个结点为s,就完成了对链表的逆置。
- 方法二:头插法逆置,用两个指针p,q,p指针标记每次头插的结点,q指针指向待逆置的结点,每次将q指针指向的结点头插到链表中,直至q指向的结点为空则完成链表的逆置。
2.递归的含义,递归能不能替代循环,递归是怎么实现的
- 递归即函数自身调用自身,本质上是自上而下解决问题,将大问题解决成小问题。递归有两个基本要素,即边界条件和递推关系。
- 递归与循环各有优缺点,递归的思路清晰代码实现简单,但递归的实现需要用到栈,每一次递归都需要用栈保存参数、返回地址和临时变量,同时会造成很多的重复计算,比如斐波那契数列的递归算法,同时当数字很大时还可能会造成栈溢出。而循环则更高效,结构简单,但是对于有些问题,使用循环会比递归更加复杂,比如二叉树的前中后序遍历。
- 递归的实现:递归通过栈实现,需要将每一层的变量状态等压入栈中,直到满足边界条件,再返回其父方法执行。
- 想到中断嵌套,但是递归和中断嵌套是不一样的概念,中断嵌套是系统在遇到更高优先级的中断提出请求时,会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。
- 中断处理的流程:首先,每一个中断都被进行了编号,即中断向量,不同的中断向量对应不同的中断处理程序。当程序执行完当前的每一条指令之后,都会区检查由没有中断请求,如果有,就在相应的脉冲到来之前读取中断向量,通过中断向量查看优先级,找对应的栈等(参考https://www.cnblogs.com/aaronLinux/p/10842499.html),然后保存当前程序的现场,跳到中断服务程序处理中断,当中断服务程序执行完毕后,恢复先前中断的程序。
3.斐波那契数列算法,使用递归和迭代方法的区别
- 斐波那契额数列的应用:有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
这就是一个斐波那契数列:登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种方法……所以,1,2,3,5,8,13……登上十级,有89种。
- 斐波那契数列公式 F(n)=F(n-1)+F(n-2)(n>2) F(0)=0 F(1)=1 F(2)=1
- 算法思想:采用递归方式的话效率很低,因为会有很多重复计算,可以采用迭代的方法,根据F(0)和F(1)计算出F(2),以此类推,可以计算出第n项,时间复杂度为O(n),(用long long数据类型,否则数字大时精度不够)
1 long long Fibo(unsigned n) 2 { 3 int result[2]={0,1}; 4 if(n<2) 5 return result[n]; 6 long long FiboOne=0; 7 long long FiboTwo=1; 8 long long FiboN=0; 9 for(unsigned int i=2;i<n;i++) 10 { 11 FiboN=FiboOne+FiboTwo; 12 FiboOne=FiboTwo; 13 FiboTwo=FiboN; 14 } 15 return FiboN; 16 }