> 技术文档 > 02.02、返回倒数第 k 个节点_返回节点指针

02.02、返回倒数第 k 个节点_返回节点指针


02.02、[简单] 返回倒数第 k 个节点

1、题目描述

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

2、题解思路

本题的关键在于使用指针,通过两个指针(fastslow),让 fast 指针比 slow 指针先走 k 步,这样当 fast 到达链表末尾时,slow 正好指向倒数第 k 个节点。

具体步骤如下:

  1. 初始化两个指针 fastslow,都指向链表的头节点。
  2. fast 先走 k 步,使得 fastslow 之间的距离为 k
  3. 同时移动 fastslow,直到 fast 到达链表的末尾。
  4. 此时,slow 指针所指向的节点就是倒数第 k 个节点,返回该节点的值。

3、详细代码解析

class Solution {public: int kthToLast(ListNode* head, int k) { // 初始化两个指针,分别指向链表的头节点 ListNode* fast = head; ListNode* slow = head; // 让 fast 指针先走 k 步 while (k--) { fast = fast->next; } // 同时移动 fast 和 slow,直到 fast 到达链表的末尾 // 当 fast 到达链表末尾时,slow 则正好指向倒数第 k 个节点,返回该节点的值 while (fast) { fast = fast->next; slow = slow->next; } // slow 现在指向倒数第 k 个节点,返回该节点的值 return slow->val; }};

4、时间复杂度与空间复杂度

  • 时间复杂度O(n),其中 n 为链表的长度。由于我们只遍历了链表一次,因此时间复杂度是线性的。
  • 空间复杂度O(1),只用了两个指针,空间开销很小。

通过使用双指针技巧,我们可以在一次遍历中高效地找到倒数第 k 个节点。这个解法在不需要额外空间的情况下,能够很好地解决问题。