当前位置:首页 > 力扣 > 力扣LCR140题:训练计划II - 链表中倒数第k个节点解法详解

力扣LCR140题:训练计划II - 链表中倒数第k个节点解法详解

5天前

力扣LCR140题:训练计划II - 链表中倒数第k个节点解法详解 力扣LCR140题解 快慢指针算法 链表操作技巧 双指针解法 数据结构与算法 链表遍历方法 算法面试题解 剑指Offer22题 链表节点查找 第1张

内容简介

本文详细解析了力扣LCR140题"训练计划II"的链表操作解法,该题实际上是剑指Offer22题的变体,要求找出链表中倒数第k个节点。通过快慢指针技巧,只需一次遍历即可高效解决问题,时间复杂度为O(n)。文章包含完整注释代码、算法思路讲解和复杂度分析,帮助读者掌握链表操作的核心技巧。


算法思路

双指针初始化‌:快指针(fast)和慢指针(slow)都指向链表头节点

‌快指针先行‌:快指针先向前移动k个节点,构建两指针间的固定距离

‌同步移动‌:两指针同时移动,直到快指针到达链表末尾

‌慢指针定位‌:此时慢指针指向的就是倒数第k个节点


代码实现(带详细注释)

class Solution {
public:
    ListNode* trainingPlan(ListNode* head, int cnt) {
        ListNode* fast = head;  // 快指针,用于先行探测
        ListNode* slow = head;  // 慢指针,最终指向目标节点
        
        // 快指针先移动cnt步,建立两指针间的距离
        while(cnt-- && fast) {  // 添加fast判空防止k大于链表长度
            fast = fast->next;
        }
        
        // 两指针同步移动,直到快指针到达链表末尾
        while(fast) {
            fast = fast->next;
            slow = slow->next;
        }
        
        return slow;  // 返回倒数第k个节点
    }
};


复杂度分析

时间复杂度‌:O(n),只需遍历链表一次

‌空间复杂度‌:O(1),仅使用常数空间


边界条件处理建议

‌空链表处理‌:添加头节点判空逻辑

‌k值过大处理‌:当k大于链表长度时返回nullptr

‌k值非法处理‌:添加对k≤0的情况处理


总结

快慢指针法是解决链表倒数第k个节点问题的高效方案,通过巧妙的两指针间距控制,避免了多次遍历链表,是面试中常见的考察点。理解这种解法有助于掌握链表操作和双指针技巧的核心思想


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1379题:找出克隆二叉树中的目标节点 - 递归解法详解

力扣1379题:找出克隆二叉树中的目标节点 - 递归解法详解

内容简介本文详细解析了力扣第1379题"找出克隆二叉树中的目标节点"的递归解法。通过深度优先搜索遍历克隆树,找到与原始树目标节点值相同的节点。这种方法时间复杂度为O(n),是理解二...

力扣1008题:从前序遍历构建二叉搜索树 - 递归解法详解

力扣1008题:从前序遍历构建二叉搜索树 - 递归解法详解

内容简介本文详细解析了力扣第1008题"从前序遍历序列构建二叉搜索树"的递归解法。通过利用BST的性质和前序遍历的特点,实现了从数组到BST的高效转换。这种方法时间复杂度为O(n^...

力扣450题:删除二叉搜索树中的节点 - 递归解法详解

力扣450题:删除二叉搜索树中的节点 - 递归解法详解

内容简介本文详细解析了力扣450题"删除二叉搜索树中的节点"的递归解法。通过递归遍历二叉搜索树并根据不同情况处理节点删除操作,实现了BST节点的精确删除。文章包含完整注释代码、算法...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。