《剑指 offer 》面试题 22:链表中的倒数第 k 个节点

马谦马谦马谦 数据结构和算法评论198字数 662阅读 2 分 12 秒阅读模式

一、题目

输入一个链表,输出该链表中倒数第 k 个节点,为了符合大多数人的习惯,k 的序号从 1 开始,即链表的尾结点是倒数第一个节点。

例如,如下链表中的倒数第 3 个节点是 3

《剑指offer》面试题22:链表中的倒数第k个节点-图片1

二、解题思路

使用快慢指针,快指针先走 n 步,然后快慢指针同时走,直到快指针为 null,慢指针就是倒数第 n 个节点。

以上面的链表为例,初始时,两个指针都指向链表开头:

《剑指offer》面试题22:链表中的倒数第k个节点-图片2

fast 指针先往前走三步:

《剑指offer》面试题22:链表中的倒数第k个节点-图片3

此时,fast 和 slow 同时往前走,直到 fast 为空:

《剑指offer》面试题22:链表中的倒数第k个节点-图片4

此时 slow 所在的位置刚好就是倒数第三个节点。

三、代码

代码中需要注意的问题:

  1. 链表可能为空,避免空指针访问。
  2. 链表长度可能不够 n,遍历 fast 的时候注意判断非空,并且外部应该判断出这一点。

四、单元测试

单元测试主要覆盖以下几点:

  1. 链表为空的场景。
  2. 链表不为空,获取倒数第 1 个节点。
  3. 链表不为空,获取倒数第 n 个节点,n 等于链表长度。
  4. 链表不为空,获取倒数第 n 个节点,n 大于链表长度。

TestFixtures 定义了三个链表,第一个链表有 5 个元素,第二个链表为空,第三个链表有 1 个元素。

 

测试案例一:获取倒数第 n 个节点,n 分别大于、小于和等于链表长度。

测试案例二:测试空链表。

测试案例三:只有一个节点的链表测试。

测试结果:

《剑指offer》面试题22:链表中的倒数第k个节点-图片5

 
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2020 年 2 月 9 日 19:22:16
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/algorithms/find-nth-node-from-end-of-list.html
redis源码分析:链表实现 Redis

redis 源码分析:链表实现

一、链表定义 链表在 redis 中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。 redis 中链表在 adlist.h 和 adlist.c 中实现,只用了 300+行代码...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证