算法之递归(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)- 链表操作相关推荐

  1. 就地链表反转_数据结构与算法系列之链表操作全集(二)(GO)

    以下完整的代码,及测试代码均可从这里获取 https://github.com/Rain-Life/data-struct-by-go 常见的链表操作 单链表反转 方法一:就地反转法 思路 就地反转法 ...

  2. 递归反转链表的一部分

    递归反转链表的一部分 反转单链表的迭代实现不是⼀个困难的事情, 但是递归实现就有点难度了,如果再加⼀点难度, 让你仅仅反转单链表中的⼀部分, 你是否能够递归实现呢? 本⽂就来由浅⼊深, 逐步地解决这个 ...

  3. 2.2基本算法之递归和自调用函数_数据结构与算法之5——队列和栈

    栈和队列比较简单,而且实用性非常广泛,这里主要介绍一下他们的概念和实现,在很多算法中,栈和队列的运用很重要,因此,虽然简单确是最重要的数据结构之一,必须重视. 栈是保证元素后进先出(后存入者先使用,L ...

  4. C++用递归实现链表的逆转(附完整源码)

    C++用递归实现链表的逆转 C++用递归实现链表的逆转算法完整源码(定义,实现,main函数测试) C++用递归实现链表的逆转算法完整源码(定义,实现,main函数测试) #include <i ...

  5. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

  6. java算法的递归问题设计_java算法-递归算法思想

    递归算法是跟常见的算法思想.使用递归算法,往往可以简化代码编写,提高程序的可读性.但是,不适合的递归往往导致程序的执行效率变低. 一.递归算法基本思想 递归算法即在程序中不断反复调用自身来叨叨求解问题 ...

  7. 递归反转链表改变原链表吗_在不使用递归的情况下找到链表的长度

    递归反转链表改变原链表吗 Solution: 解: Algorithm to find length 查找长度的算法 Input: 输入: A singly linked list whose add ...

  8. 单链表操作实现getelem_c语言实现--带头结点单链表操作

    可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...

  9. 数据结构与算法 完整版单链表(附GIF)

    因为博主认为单链表是非常重要的数据结构,能够熟练使用单链表的话后面的数据结构会越学越轻松,所以博主就把这篇博客做的细致一点,不是很好懂的地方做成 gif 动画,希望大家能理解期中代码的含义 学习链表的 ...

最新文章

  1. 浅谈JVM的GC策略
  2. Sublime Text 4首个稳定版发布:全新UI、多选项卡、支持GPU渲染
  3. 若格式化都无效 如何清除”不可杀“病毒?
  4. 自考护理学计算机考试时间,护理学专业2019年10月江苏自考科目及考试时间安排...
  5. (网络编程)UDP实现聊天
  6. c# 怎样从bitmap初始化image类_C#二维数组初始化概括(新手篇)
  7. iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
  8. Android7.0 emui主题,全新EMUI5.0基于Android7.0 天生快,一生快!
  9. python作用域总结_关于Python作用域自学总结
  10. 一年多开源没进展,我也放弃了
  11. 苹果计算机关机时间不准,苹果电脑怎么设置定时自动关机
  12. [原创]简易文本编辑器( 无界面)
  13. CS上线Linux--坑太多了
  14. tomcat localhost log 和 tomcat catalina log分别是什么日志
  15. HTML怎么设置下划线?html文字加下划线方法
  16. linux trac svn,SVN+Trac版本库的创建和Trac环境设置
  17. 纽约大学计算机与科学,纽约大学计算机科学专业排名第30(2020年USNEWS美国排名)...
  18. BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结
  19. 样式案例——图片背景左上角显示用户头像和用户名
  20. 远程实时监控搭建_远程学习的烦恼正在实时展开

热门文章

  1. stream流对象的理解及使用
  2. 2021-2027年中国智能调光玻璃行业市场行情动态及投资前景分析报告
  3. Apache Maven 安装与配置-修改源
  4. 王道考研 计算机网络笔记 第四章:网络层
  5. Deformable 可变形的DETR
  6. 2019个嵌入式市场研究,持续的C/C++优势
  7. 2021年大数据Hadoop(十一):HDFS的元数据辅助管理
  8. Django 布署6.5
  9. Django 模型成员2.2
  10. [JS] [编程题] 配置文件恢复