// 处理特殊情况
        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),只使用常数级别的额外空间