题目描述

输入一个链表,输出该链表中倒数第k个结点。例如:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。

解题思路

寻常的解法,找到链表的长度n,通过长度找到倒数第k个节点的位置n-k+1,之后遍历找到结果,这个方法的效率是2n,这里不用这种方法,这里用双指针的方法实现。
1.第一个指针从链表的头指针开始遍历k-1个节点,第二个指针不动
2.从k步开始,第二个指针也开始从链表的头指针开始遍历
3.由于两个指针始终保持k-1,当第一个指针到达链表结尾的时候,第二个指针也正好到达倒数第k个节点。

鲁棒性:鲁棒是Robust的音译,也就是健壮和强壮的意思,它是在异常和危险情况下系统生存的关键。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。

这个题中有三处鲁棒性:
1.节点为空
2.总节点数小于k
3.k小于0

代码实现

  1. /// <summary>
  2. /// 链表
  3. /// </summary>
  4. public class ListNode
  5. {
  6. public int item;
  7. public ListNode next;
  8. public ListNode(int x)
  9. {
  10. item = x;
  11. }
  12.  
  13. /// <summary>
  14. /// 生成链表
  15. /// </summary>
  16. /// <param name="length"></param>
  17. public static ListNode CreateNodeList(int length)
  18. {
  19. ListNode listNode = new ListNode();
  20. var temp = listNode;
  21. for (int i = ; i < length; i++)
  22. {
  23. temp = nextList(temp, i);
  24. }
  25.  
  26. return listNode;
  27.  
  28. //下一个
  29. ListNode nextList(ListNode node, int value)
  30. {
  31. while (node.next != null)
  32. {
  33. node = node.next;
  34. }
  35. var next = new ListNode(value);
  36. node.next = next;
  37. return next;
  38. }
  39. }
  40. }
  1. public static ListNode FindBackKth(ListNode node, int k) {
  2. if (node == null || k <= ) {
  3. return null;
  4. }
  5.  
  6. ListNode firstNode = node;
  7. ListNode secondNode = node;
  8. for (int i = ; i <= k - ; i++) {
  9. firstNode = firstNode.next;
  10. if (firstNode == null) {
  11. return null;
  12. }
  13. }
  14.  
  15. while (firstNode.next != null) {
  16. firstNode = firstNode.next;
  17. secondNode = secondNode.next;
  18. }
  19.  
  20. return secondNode;
  21. }

测试

  1. [Fact]
  2. public void TestNull()
  3. {
  4. ListNode listNode = null;
  5. Assert.Null(Coding014.FindBackKth(listNode,));
  6. }
  7.  
  8. [Fact]
  9. public void TestK()
  10. {
  11. ListNode listNode = new ListNode();
  12. Assert.Null(Coding014.FindBackKth(listNode, ));
  13. Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
  14. Assert.Null(Coding014.FindBackKth(listNode, ));
  15. }
  16.  
  17. [Fact]
  18. public void Test1()
  19. {
  20. //0,1,2,3,4,5
  21. ListNode listNode = ListNode.CreateNodeList();
  22. Assert.Null(Coding014.FindBackKth(listNode, ));
  23. Assert.Null(Coding014.FindBackKth(listNode, ));
  24. Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
  25. Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
  26. Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
  27. }

代码的鲁棒性:链表中倒数第k个结点的更多相关文章

  1. 代码的鲁棒性:链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. 代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达 ...

  2. 链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 因为是单向链表,如果使用最普通的遍历来解决的话会多出很多不必要的遍历.有一个比较好的解法,设置两个指针两个指针之间差k-1个位置,也就是当后 ...

  3. 【Java】 剑指offer(22) 链表中倒数第k个结点

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...

  4. 《剑指offer》第二十二题(链表中倒数第k个结点)

    // 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...

  5. 《剑指offer》— JavaScript(14)链表中倒数第k个结点

    链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点: 然后两个指针同时 ...

  6. 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点

    鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...

  7. 剑指Offer 链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点.     思路: 法1:设置2个指针p,q.p先移动k次,然后pq同时后移,p到链表尾尾的时候,q指向倒数第k个节点. 注意://需要考虑k=0,以 ...

  8. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  9. IT公司100题-13-求链表中倒数第k个结点

    问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...

随机推荐

  1. .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇

    .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇 本文作为初级篇,适合已经安装好.NET Core 环境以及 Gtk 环境,并具备了 C#开发基础知识,能跑一些简单的例子,希望更 ...

  2. 浅谈集群版Redis和Gossip协议

    昨天的文章写了关于分布式系统中一致性哈希算法的问题,文末提了一下Redis-Cluster对于一致性哈希算法的实现方案,今天来看一下Redis-Cluster和其中的重要概念Gossip协议. 1.R ...

  3. 实战webpack系列02

    02. 开始使用webpack 1.1.安装 Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample project),在终端中转到该文件夹后执行下述指令就可 ...

  4. diff()函数的使用

    1.diff():返回略微迭代(lagged)的或滞后的不同(iterated diferences). > x<-cumsum(cumsum(1:10)) > x [1] 1 4 ...

  5. 4k图片爬取+中文乱码

    4k图片爬取+中文乱码 此案例有三种乱码解决方法,推荐第一种 4k图片爬取其实和普通图片爬取的过程是没有本质区别的 import requests import os from lxml import ...

  6. lvm讲解、磁盘故障小案例

    第4周第3次课(4月11日) 课程内容: 4.10/4.11/4.12 lvm讲解4.13 磁盘故障小案例 4.10/4.11/4.12 lvm讲解 lvm可以给磁盘扩容和缩容,结构图如下. 首先创建 ...

  7. 给一线讲产品·8期|VPC、子网、安全组,是什么关系?

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  8. 用正则表达式来验证QQ号是否合法

    import re #首先我们定义一个函数利用正则表达式来获取QQ号 def testQQ(qq): pattern = re.compile('[1-9][0-9]{4,10}$') result ...

  9. MD5、公钥、私钥、加密、认证

    MD5 MD5的全称是Message-Digest Algorithm 5. MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法. 换句话说就是,即使你看到 ...

  10. CF1009F Dominant Indices(启发式合并)

    You are given a rooted undirected tree consisting of nn vertices. Vertex 11 is the root. Let's denot ...