输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
快慢指针:使用两个指针 slow
和 fast
,首先让 fast
指针先走 k 步,然后再同时移动 slow
和 fast
指针,直到 fast
指针到达链表的末尾。此时 slow
指针所指的节点就是倒数第 k 个节点。
链表为:1 -> 2 -> 3 -> 4 -> 5
,k = 2
。
-
初始状态:
slow
指向节点1
。fast
指向节点1
。
-
让
fast
指针先走k = 2
步:- 第一次循环:
fast
移动到节点2
。
- 第二次循环:
fast
移动到节点3
。
- 第一次循环:
现在,fast
指针和 slow
指针之间相隔 k = 2
步。
- 同时移动
slow
和fast
指针:- 当
fast
指针到达链表末尾时,slow
指针正好指向倒数第k
个节点。
- 当
C++核心代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* FindKthToTail(ListNode* pHead, int k) {
if (pHead ==nullptr || k < 0){
return nullptr;
}
ListNode* slow = pHead;
ListNode* fast = pHead;
for (int i = 0; i<k;i++){
if (fast == nullptr){
return nullptr;
}
fast = fast->next;
}
while (fast != nullptr) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
};
Python核心代码
class Solution:
def FindKthToTail(self, pHead: ListNode, k: int) -> ListNode:
if not pHead or k <= 0:
return None
# 使用快慢指针来找到倒数第 k 个节点
slow = fast = pHead
# 先让 fast 指针先走 k 步
for _ in range(k):
if not fast:
return None # 链表长度小于 k
fast = fast.next
# 同时移动 slow 和 fast,直到 fast 到达链表末尾
while fast:
slow = slow.next
fast = fast.next
return slow