链表中倒数第k个节点
题目
输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。
思路
本题和 leetcode 19. Remove Nth Node From End of List 是同一道题,和书中是同一个思路:设置两个指针,第一个指针先遍历k-1步;从第k步开始,第二个指针指向头结点,两个节点同时往后遍历,当第一个指针到达最后一个节点时,第二个指针指向的正好是倒数第k个节点。
测试用例
- 功能测试(第k个节点分别在链表的中间、头结点和尾节点)
- 特殊测试(头结点为null、k超出范围)
java代码
1 | public class KthNodeFromEnd { |
总结
- 注意代码的鲁棒性,开始思考前都需要注意特殊输入测试;
- 一个指针遍历链表无法解决问题时,可以考虑使用两个指针来遍历链表:两个指针先后遍历(即该题目)、或者两个指针遍历速度不同(如:求链表中的中间结点,可以令一个指针一次走一步,另一个指针一次走两步来实现)