代码的鲁棒性:链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第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
代码实现
/// <summary>
/// 链表
/// </summary>
public class ListNode
{
public int item;
public ListNode next;
public ListNode(int x)
{
item = x;
} /// <summary>
/// 生成链表
/// </summary>
/// <param name="length"></param>
public static ListNode CreateNodeList(int length)
{
ListNode listNode = new ListNode();
var temp = listNode;
for (int i = ; i < length; i++)
{
temp = nextList(temp, i);
} return listNode; //下一个
ListNode nextList(ListNode node, int value)
{
while (node.next != null)
{
node = node.next;
}
var next = new ListNode(value);
node.next = next;
return next;
}
}
}
public static ListNode FindBackKth(ListNode node, int k) {
if (node == null || k <= ) {
return null;
}
ListNode firstNode = node;
ListNode secondNode = node;
for (int i = ; i <= k - ; i++) {
firstNode = firstNode.next;
if (firstNode == null) {
return null;
}
}
while (firstNode.next != null) {
firstNode = firstNode.next;
secondNode = secondNode.next;
}
return secondNode;
}
测试
[Fact]
public void TestNull()
{
ListNode listNode = null;
Assert.Null(Coding014.FindBackKth(listNode,));
} [Fact]
public void TestK()
{
ListNode listNode = new ListNode();
Assert.Null(Coding014.FindBackKth(listNode, ));
Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
Assert.Null(Coding014.FindBackKth(listNode, ));
} [Fact]
public void Test1()
{
//0,1,2,3,4,5
ListNode listNode = ListNode.CreateNodeList();
Assert.Null(Coding014.FindBackKth(listNode, ));
Assert.Null(Coding014.FindBackKth(listNode, ));
Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
Assert.Equal(, Coding014.FindBackKth(listNode, ).item);
}
代码的鲁棒性:链表中倒数第k个结点的更多相关文章
- 代码的鲁棒性:链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点. 代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达 ...
- 链表中倒数第k个结点
题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 因为是单向链表,如果使用最普通的遍历来解决的话会多出很多不必要的遍历.有一个比较好的解法,设置两个指针两个指针之间差k-1个位置,也就是当后 ...
- 【Java】 剑指offer(22) 链表中倒数第k个结点
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...
- 《剑指offer》第二十二题(链表中倒数第k个结点)
// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...
- 《剑指offer》— JavaScript(14)链表中倒数第k个结点
链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点: 然后两个指针同时 ...
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...
- 剑指Offer 链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 法1:设置2个指针p,q.p先移动k次,然后pq同时后移,p到链表尾尾的时候,q指向倒数第k个节点. 注意://需要考虑k=0,以 ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- IT公司100题-13-求链表中倒数第k个结点
问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...
随机推荐
- 聚类-DBSCAN基于密度的空间聚类
1.DBSCAN介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度 ...
- webpack到底是干什么用的?
转载于:https://segmentfault.com/a/1190000014148611?utm_source=tag-newest 概念问题一:什么是webpack和grunt和gulp有什么 ...
- 【Android - 自定义View】之View的工作过程简介
View的工作过程分为三个过程: View的measure过程: View的layout过程: View的draw过程. 我们知道,一个Activity就是一个窗口,这个窗口中包含一个Window.一 ...
- centos 7 MysSQL 5.6.39 源码安装
MySQL 5.6.39 二进制安装 CentOS 7 将默认数据库MySQL替换成了Mariadb. 这里会从系统的环境准备开始一步一步安装. 环境准备 系统版本 内核版本 IP地址 Centos ...
- centos 7 MysSQL 5.6.39 二进制安装
MySQL 5.6.39 二进制安装 CentOS 7 将默认数据库MySQL替换成了Mariadb. 这里会从系统的环境准备开始一步一步安装. 环境准备 系统版本 内核版本 IP地址 Centos ...
- shell介绍、命令历史、命令补全和别名、通配符、输入输出重定向
第5周第5次课(4月20日) 课程内容: 8.1 shell介绍8.2 命令历史8.3 命令补全和别名8.4 通配符8.5 输入输出重定向 8.1 shell介绍 使用yum+管道方式查看zsh和ks ...
- linux进程间通信之共享内存学习记录
进程 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed). 广义定义:进程是一个具有一定独立功能的 ...
- PAT乙级练习(1001)
1001 害死人不偿命的(3n+1)猜想 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n + 1) 砍掉一半.这样一直反复砍下去,最 ...
- Python开发GUI工具介绍,实战:将图片转化为素描画!【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- [Abp vNext 源码分析] - 13. 本地事件总线与分布式事件总线 (Rabbit MQ)
一.简要介绍 ABP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装 ...