题解 | 链表中倒数最后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),只使用常数级别的额外空间

数据结构之链表 文章被收录于专栏

链表是数据结构中的重要内容,其编程问题围绕链表的特性(动态内存、指针关联、非连续存储等)展开,常见问题可归纳为以下几类,涵盖基础操作、算法技巧及边界场景处理: 一、基础操作类 二、查找与定位类 三、反转与逆序类 四、环相关问题 五、合并与拼接类 六、相交与公共节点类 七、去重与筛选类 八、排序类 九、特殊结构链表问题 十、边界与细节处理

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务