// 处理特殊情况
if (pHead == nullptr || k <= 0) {
return nullptr;
}
ListNode* fast = pHead;
ListNode* slow = pHead;
// 快指针先走k步
for (int i = 0; i < k; i++) {
// 如果链表长度小于k,返回nullptr
if (fast == nullptr) {
return nullptr;
}
fast = fast->next;
}
// 快慢指针同时前进
while (fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
};
核心思路
双指针技巧:使用快慢两个指针,快指针先走k步,然后两个指针同时前进
当快指针到达末尾(null)时,慢指针正好指向倒数第k个节点
边界情况处理
空链表:直接返回nullptr
k ≤ 0:返回nullptr
链表长度小于k:在快指针前进过程中发现并返回nullptr
复杂度分析
时间复杂度:O(n),只需要遍历链表一次
空间复杂度:O(1),只使用常数级别的额外空间