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

一、题目

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

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

二、解题思路

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

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

fast 指针先往前走三步:

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

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

三、代码

代码中需要注意的问题:

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

四、单元测试

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

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

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

 

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

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

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

测试结果:

发表评论