题解 | #链表中倒数最后k个结点#
链表中倒数最后k个结点
https://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead ListNode类 * @param k int整型 * @return ListNode类 */ public ListNode FindKthToTail (ListNode pHead, int k) { // write code here if (pHead == null || k <= 0) { return null; } ListNode slow = pHead; ListNode fast = pHead; // 先让fast指针移动k步 for (int i = 0; i < k; i++) { if (fast == null) { return null; // 链表长度小于k,返回null } fast = fast.next; } // 然后同时移动slow和fast指针,直到fast指针到达链表末尾 while (fast != null) { slow = slow.next; fast = fast.next; } return slow; // 此时slow指向倒数第k个节点 } }
这个问题的思路是使用快慢指针来实现在单链表中找到倒数第 k 个节点。具体的步骤如下:
- 创建两个指针,一个称为 slow,另一个称为 fast。初始化它们都指向链表的头节点。
- 让 fast 指针先向前移动 k 步。这样,fast 指针就领先 slow 指针 k 个节点。
- 同时移动 slow 和 fast 指针,直到 fast 指针到达链表的末尾。由于 fast 指针领先 slow 指针 k 个节点,当 fast 指针到达末尾时,slow 指针就会指向倒数第 k 个节点。
- 返回 slow 指针所指向的节点。
这种方法的关键在于初始化时先让 fast 指针领先 k 个节点,然后同步移动两个指针,使它们的距离保持为 k,这样当 fast 指针到达末尾时,slow 指针就会指向倒数第 k 个节点。
这个思路适用于空间复杂度 O(n) 和 O(1) 的两种实现方式。在空间复杂度 O(1) 的实现方式中,我们不需要使用额外的数据结构来存储节点,只需要两个指针即可。