题目链接

牛客上有特殊 case 的情况,个人觉得这种特殊情况还是要考虑到的

牛客—链表中倒数第K个节点

题目描述

输入一个链表,输出该链表中倒数第k个节点。

解题思路

1. 双指针

个人感觉是一道想到了就很简单,想不到的话就很难的题,基本上做过一次后对这种类型的题就有思路了。

设置两个指针 fastslow,令 fast 先走 k 步,然后两个指针一起走,当 fastnull时,slow 指针所在的节点即为倒数第 K 个节点。

这道题还需要考虑一个特殊的 case 情况:如果给定的 K 值为负值或者超过了链表的长度,那么直接返回 null 就好。

  1. public class Solution {
  2. public ListNode FindKthToTail(ListNode head,int k) {
  3. ListNode fast = head;
  4. ListNode slow = head;
  5. while (k != 0) {
  6. // 特殊 case 判断
  7. if (fast == null) return null;
  8. fast = fast.next;
  9. k--;
  10. }
  11. while (fast != null) {
  12. fast = fast.next;
  13. slow = slow.next;
  14. }
  15. return slow;
  16. }
  17. }
  • 时间复杂度22. 链表中倒数第 k 个节点 - 图1N 取决于链表长度。
  • 空间复杂度22. 链表中倒数第 k 个节点 - 图2