题解 | 链表中倒数最后k个结点
链表中倒数最后k个结点
https://www.nowcoder.com/practice/886370fe658f41b498d40fb34ae76ff9?tpId=295&tqId=1377477&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page
// 处理特殊情况
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),只使用常数级别的额外空间
数据结构之链表 文章被收录于专栏
链表是数据结构中的重要内容,其编程问题围绕链表的特性(动态内存、指针关联、非连续存储等)展开,常见问题可归纳为以下几类,涵盖基础操作、算法技巧及边界场景处理: 一、基础操作类 二、查找与定位类 三、反转与逆序类 四、环相关问题 五、合并与拼接类 六、相交与公共节点类 七、去重与筛选类 八、排序类 九、特殊结构链表问题 十、边界与细节处理
查看13道真题和解析