算法之递归(3)- 链表操作
算法之递归(3)- 链表操作
递归(2)尝试了一个单链表的遍历,同时又分析了如何添加自己的操作,是在递归调用之前,还是在递归调用之后。
今天,打算将问题深入一下,即添加相应的操作在递归的过程中。
(免责声明:下面的解法纯属娱乐 ,另外,示例代码未经编译和调试,许多想法未经实践验证。)
查找链表当中倒数第N个节点。
解法一
逐层递归,遍历到最后一个节点,并从返回的节点一次向后递归,遍历N次,找到倒数第N个节点。
private LNode targetNode = null;private LNode FindLastNthNode(LNode head, int index){if (head.Next == null){return head;}FindLastNthNode(head.Next, index);LNode tmpNode = head;while ((head.Next != null) && (index > 0)){head = head.Next;index--;}if (head.Next == null && index == 0){targetNode = tmpNode;return targetNode;}return targetNode;}
分析
1. 额外的全局性的辅助变量。
2. 时间复杂度为O(index * n),n为链表的长度。
3. 性能开销较大。
解法二(解法一的变形)
每当遍历到当前节点,即再循环向后遍历n个,如果节点遍历到最后,并且index自减等于0,说明当前节点即为要找的倒数第n个。也就是说解法一是从后向前找,而解法二是从前向后找。
private LNode targetNode2 = null;private LNode FindLastNthNode2(LNode head, int index){if (head.Next == null)return head;LNode tmpNode = head;while (head != null && index >= 0){head = head.Next;index--;}if (head == null && index == 0){targetNode2 = tmpNode;return targetNode2;}return targetNode2;}
分析:与解法一一样。
解法三
定义一个全局变量,用来计数,当递归从最后一个节点返回时,计数器减减,当等于0时,这个节点即是要找的倒数第N个节点。
private int counter = 0;private LNode targetNode2;private LNode FindLastNthNode2(LNode head, int index){if (head.Next == null){counter = index;return head;}FindLastNthNode2(head.Next, index);counter--;if (counter == 0){targetNode2 = head;return targetNode2;}return targetNode2;}
分析
1. 两个辅助变量。
2. 时间复杂度为O(n)。
3. 多余的index,累赘的counter。
======= 后记 =======
其实以上几个解决方案个人觉得都不够perfect。
像类似于链表这样的操作,基本就是两指针。
于是我重新给了一个方案如下。
(该段代码已经编译、运行及测试通过)
解法四:
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication17 {class Program{static void Main(string[] args){Node head = new Node(){Data = "Head"};Node lucas = new Node(){Data = "Lucas"};Node bill = new Node(){Data = "Bill"};Node steve = new Node(){Data = "Steve"};Node anders = new Node(){Data = "Anders"};Node jordan = new Node(){Data = "Jordan"};head.Next = lucas;lucas.Next = bill;bill.Next = steve;steve.Next = anders;anders.Next = jordan;Program p = new Program();Node resultNode = p.FindLastNthNode(head, 2);Console.WriteLine(resultNode.Data);Console.ReadLine();}private Node FindLastNthNode(Node node, int n){if(node == null){return node;}if(n <= 0){throw new ArgumentException("n");}Node node1 = node;Node node2 = node;return this.InternalFindLastNthNode(node1, node2, n);}private Node InternalFindLastNthNode(Node node1, Node node2, int n){if(node1 == null){return node2;}if(n == 0){return this.InternalFindLastNthNode(node1.Next, node2.Next, 0);}return this.InternalFindLastNthNode(node1.Next, node2, --n);}}public class Node{public string Data { get; set; }public Node Next { get; set; }} }
Best Regards,
Lucas Luo
转载于:https://www.cnblogs.com/lucasluo/archive/2012/07/31/2617417.html
算法之递归(3)- 链表操作相关推荐
- 就地链表反转_数据结构与算法系列之链表操作全集(二)(GO)
以下完整的代码,及测试代码均可从这里获取 https://github.com/Rain-Life/data-struct-by-go 常见的链表操作 单链表反转 方法一:就地反转法 思路 就地反转法 ...
- 递归反转链表的一部分
递归反转链表的一部分 反转单链表的迭代实现不是⼀个困难的事情, 但是递归实现就有点难度了,如果再加⼀点难度, 让你仅仅反转单链表中的⼀部分, 你是否能够递归实现呢? 本⽂就来由浅⼊深, 逐步地解决这个 ...
- 2.2基本算法之递归和自调用函数_数据结构与算法之5——队列和栈
栈和队列比较简单,而且实用性非常广泛,这里主要介绍一下他们的概念和实现,在很多算法中,栈和队列的运用很重要,因此,虽然简单确是最重要的数据结构之一,必须重视. 栈是保证元素后进先出(后存入者先使用,L ...
- C++用递归实现链表的逆转(附完整源码)
C++用递归实现链表的逆转 C++用递归实现链表的逆转算法完整源码(定义,实现,main函数测试) C++用递归实现链表的逆转算法完整源码(定义,实现,main函数测试) #include <i ...
- 【python】数据结构和算法 + 浅谈单链表与双链表的区别
有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...
- java算法的递归问题设计_java算法-递归算法思想
递归算法是跟常见的算法思想.使用递归算法,往往可以简化代码编写,提高程序的可读性.但是,不适合的递归往往导致程序的执行效率变低. 一.递归算法基本思想 递归算法即在程序中不断反复调用自身来叨叨求解问题 ...
- 递归反转链表改变原链表吗_在不使用递归的情况下找到链表的长度
递归反转链表改变原链表吗 Solution: 解: Algorithm to find length 查找长度的算法 Input: 输入: A singly linked list whose add ...
- 单链表操作实现getelem_c语言实现--带头结点单链表操作
可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...
- 数据结构与算法 完整版单链表(附GIF)
因为博主认为单链表是非常重要的数据结构,能够熟练使用单链表的话后面的数据结构会越学越轻松,所以博主就把这篇博客做的细致一点,不是很好懂的地方做成 gif 动画,希望大家能理解期中代码的含义 学习链表的 ...
最新文章
- 浅谈JVM的GC策略
- Sublime Text 4首个稳定版发布:全新UI、多选项卡、支持GPU渲染
- 若格式化都无效 如何清除”不可杀“病毒?
- 自考护理学计算机考试时间,护理学专业2019年10月江苏自考科目及考试时间安排...
- (网络编程)UDP实现聊天
- c# 怎样从bitmap初始化image类_C#二维数组初始化概括(新手篇)
- iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
- Android7.0 emui主题,全新EMUI5.0基于Android7.0 天生快,一生快!
- python作用域总结_关于Python作用域自学总结
- 一年多开源没进展,我也放弃了
- 苹果计算机关机时间不准,苹果电脑怎么设置定时自动关机
- [原创]简易文本编辑器( 无界面)
- CS上线Linux--坑太多了
- tomcat localhost log 和 tomcat catalina log分别是什么日志
- HTML怎么设置下划线?html文字加下划线方法
- linux trac svn,SVN+Trac版本库的创建和Trac环境设置
- 纽约大学计算机与科学,纽约大学计算机科学专业排名第30(2020年USNEWS美国排名)...
- BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结
- 样式案例——图片背景左上角显示用户头像和用户名
- 远程实时监控搭建_远程学习的烦恼正在实时展开