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

struct ListNode
{int value;ListNode *next;
};

为了实现只遍历链表一次就能找到倒数第 k 个结点,我们可以定义两个指针。
第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;
从第 k 步开始,第二个指针也开始从链表的头指针开始遍历。
由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。

代码如下:

ListNode *FindKthToTail(ListNode *pListHead, unsigned int k)
{ListNode *pAhead = pListHead;ListNode *pBehind = nullptr;for (unsigned int i = 0; i < k - 1; i++){pAhead = pAhead->next;}pBehind = pListHead;while (pAhead->next != nullptr){pAhead = pAhead->next;pBehind = pBehind->next;}return pBehind;
}

以上面的代码为例,面试官可以找出3种办法让这段代码崩溃:

  1. 输入的pListHead为空指针。由于代码会试图访问空指针指向的内存,程序崩溃。
  2. 输入的以pListHead为头结点的链表的结点总数少于k。由于在for循环中会在链表上向前走k-1步,仍然会由于空指针造成程序崩溃。
  3. 输入的参数k为0。由于k是一个无符号整数,那么在for循环中k-1得到的将不是-1,而是4294967295(无符号的0xFFFFFFFF)。因此for循环执行的次数远远超出我们的预计,同样也会造成程序崩溃。

写代码要特别注意鲁棒性。

针对前面指出的 3 个问题,我们要分别处理。

  1. 如果输入的链表头指针为 NULL,那么整个链表为空,此时查找倒数第 k 个结点自然应该返回NULL。
  2. 如果输入的k是0,也就是试图查找倒数第0个结点,由于我们计数是从1 开始的,因此输入0 没有实际意义,也可以返回NULL。
  3. 如果链表的结点数少于 k,在 for 循环中遍历链表可能会出现指向 NULL的m_pNext,因此我们在for循环中应该加一个if判断。

修改之后的代码如下:

ListNode *FindKthToTail(ListNode *pListHead, unsigned int k)
{if (pListHead == nullptr || k == 0) return nullptr;ListNode *pAhead = pListHead;ListNode *pBehind = nullptr;for (unsigned int i = 0; i < k - 1; i++){if (pAhead->next != nullptr){pAhead = pAhead->next;}else return nullptr;}pBehind = pListHead;while (pAhead->next != nullptr){pAhead = pAhead->next;pBehind = pBehind->next;}return pBehind;
}

测试用例:
● 功能测试(第k 个结点在链表的中间,第k 个结点是链表的头结点,第k个结点是链表的尾结点)。
● 特殊输入测试(链表头结点为 NULL 指针,链表的结点总数少于k,k等于0)。
本题考点:
● 考查对链表的理解。
● 考查代码的鲁棒性。鲁棒性是解决这道题的关键所在。如果应聘者写出的代码有着多处崩溃的潜在风险,那么他是很难通过这轮面试的。
相关题目:
● 求链表的中间结点。如果链表中结点总数为奇数,返回中间结点;如果结点总数是偶数,返回中间两个结点的任意一个。为了解决这个问题,我们也可以定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。当走得快的指针走到链表的末尾时,走得慢的指针正好在链表的中间。
● 判断一个单向链表是否形成了环形结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环形链表;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上第一个指针,那么链表就不是环形链表。

[剑指offer]面试题15:链表中倒数第k个结点相关推荐

  1. 剑指offer面试题[15]-链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 假设链表有n个结点,那么倒数第k个结点就是从头结点开始的第n-k+1个结点,我们只要从头结点开始往后走n-k+1步就可以了.那么问题来了: ...

  2. 【剑指offer-Java版】15链表中倒数第K个结点

    链表中倒数第K个结点:快慢指针解决 需要注意的地方是 1) 可能会存在输入的链表大小小于k 2) 输入的k可能小于等于0 - 所以必须限定k大于0 public class _Q15 {public ...

  3. 剑指Offer - 面试题22. 链表中倒数第k个节点(快慢指针)

    1. 题目 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5 ...

  4. 剑指offer面试题22. 链表中倒数第k个节点(链表)

    题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  5. 剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点 ...

  6. 剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 节点结构如下: public class ListNode {int val ...

  7. 剑指offer:链表中倒数第k个结点 python实现

    链表中倒数第k个结点 输入一个链表,输出该链表中倒数第k个结点. 解题思路 暴力求解: 判断链表是否为空: 复制链表,遍历一遍统计其长度: 如果长度小于k.则返回None: 否则,返回其长度-k的链表 ...

  8. 《剑指offer》链表中倒数第k个结点

    题目:输入一个链表,输出该链表中倒数第k个结点. 解析:需要逆向输出节点,可以正向把所有的节点都保存到list里,然后再逆向的输出 /* public class ListNode {int val; ...

  9. 《剑指Offer》 链表中倒数第k个结点

    题目描述: 输入一个链表,输出该链表中倒数第k个结点. 思路: 设置一个新ret,先将pListHead位置往后移k-1位,使得ret与pListHead距离为k-1,这样只要pListHead为最后 ...

最新文章

  1. Android源码之Camera系统架构
  2. Windows应用程序进程级别统一监控实践
  3. 更改本地dns的host文件解析池的FQDN,以便office communicator非域远程登录
  4. MTK for Google AttestationKey介绍
  5. python 的类装饰器
  6. CNN中的权重维度解析以及卷积核中的数值是怎么确定的
  7. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)
  8. php如何打开图片的权限,php如何控制用户对图片的访问 PHP禁止图片盗链 php技巧...
  9. 一些比较恶心的代码片段
  10. Irrlicht例002--Quake3Map
  11. 2021-03-26,拉胯的三条命令,HappyCTFd
  12. 三菱plc与计算机无协议通讯,三菱PLC编程口协议与专用协议的区别
  13. 计算机学业水平测试初中生操作题,高二计算机学业水平测试——excel操作题
  14. sqlserver如何修改服务器排序规则,修改sqlserver2008数据库的排序规则 (转)
  15. IDEA 查看项目编码
  16. 最终分化的SH-SY5Y细胞为研究多巴胺激动剂的神经保护作用提供了一个模型系统
  17. KDD 2017 参会报告
  18. 从原先部分得到新字符串
  19. C语言atoi函数详解
  20. IDEA新建本地项目关联远程本地仓库和git仓库详细步骤

热门文章

  1. 【ArcGIS遇上Python】Python批量将多个文件夹下的多个影像数据镶嵌至新栅格
  2. 【空间数据库】ArcSDE 10.7+SQLEXPRESS+ArcServer 10.7.ecp企业级数据库环境搭建
  3. Android之elevation实现阴影效果
  4. Android之解决androidx.appcompat.widget.Toolbar去掉左边距
  5. LeetCode之Max Consecutive Ones
  6. linux之ls只显示文件或者文件夹
  7. 使用VS开发C++ 控制台程序或其他项目出现 ‘ LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib” ’ 常规解决办法
  8. springmvc 传对象报400_那么火的SpringMVC到底有什么过人之处呢
  9. java完全解耦_java-完全解耦 - osc_bc7dotjc的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. IDEA简单配置教程