C++解决输出链表中倒数k个结点的问题

 更新时间:2021年12月15日 08:46:03   作者:翟天保Steven  
这篇文章主要给大家介绍了关于如何利用C++解决输出链表中倒数k个结点的问题,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下

题目描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。

数据范围:0<=n<=10^5,0<=ai<=10^9,0<=k<=10^9

要求:空间复杂度O(n),时间复杂度O(n)

进阶:空间复杂度O(1),时间复杂度O(n)

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。

示例

输入:

{1,2,3,4,5},2

返回值:

{4,5}

说明:

返回倒数第2个节点4,系统会打印后面所有的节点来比较。

解题思路

本题考察数据结构链表的使用。本题常用两种思路,一种是比较基础的,就是用容器把链表指针依次存储,输出倒数第k个即可,这样空间复杂度为O(n);另一种进阶解法,快慢指针法,让快指针先走k步,当它走到头时,此时慢指针的位置就是倒数第k个结点。

测试代码为快慢指针法,容器法比较简单就不写了。

测试代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        // 空链表直接返回
        if(pHead == NULL)
            return pHead;
        // 快慢指针
        ListNode *fast = pHead;
        ListNode *slow = pHead;
        // 让快指针先走k步
        while(k--)
        {
            if(fast == NULL)
                return NULL;
            fast = fast->next;
        }
        // 当快指针走完时,慢指针的位置就是倒数第k个结点
        while(fast != NULL)
        {
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

补充

第二种实现方法:

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        // write code here
        ListNode* p=pHead;
        ListNode* q=pHead;
        if(pHead==NULL)return NULL;
        while(k--)
        {
            if(q==NULL)return NULL;
            q=q->next;
            
            //k--;
        }
        //if(q==NULL)return pHead;
        while(q)
        {
            p=p->next;
            q=q->next;
        }
        return p;
    }
};

到此这篇关于C++解决输出链表中倒数k个结点的问题的文章就介绍到这了,更多相关C++输出链表中倒数k个结点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中传值与传指针的介绍与区别

    C语言中传值与传指针的介绍与区别

    这篇文章主要给大家介绍了关于C语言中传值与传指针的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • 利用C/C++实现较完整贪吃蛇游戏

    利用C/C++实现较完整贪吃蛇游戏

    这篇文章主要为大家详细介绍了利用C/C++实现较完整贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • C++ 获取dll当前路径下所有文件

    C++ 获取dll当前路径下所有文件

    本文主要介绍了C++ 获取dll当前路径下所有文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C++多继承多态的实例详解

    C++多继承多态的实例详解

    这篇文章主要介绍了C++多继承多态的实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++实现哈夫曼树简单创建与遍历的方法

    C++实现哈夫曼树简单创建与遍历的方法

    这篇文章主要介绍了C++实现哈夫曼树简单创建与遍历的方法,对于C++算法的学习来说不失为一个很好的借鉴实例,需要的朋友可以参考下
    2014-07-07
  • C语言中数组的使用详解

    C语言中数组的使用详解

    这篇文章主要为大家介绍了C语言中数组的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C语言开发简易版扫雷小游戏

    C语言开发简易版扫雷小游戏

    本文给大家分享的是一个使用C语言开发的命令行下的简易版扫雷小游戏,本身没有什么太多的技术含量,只不过是笔者的处女作,所以还是推荐给大家,希望对大家学习C能够有所帮助。
    2015-12-12
  • c语言获取直播吧最近一周nba比赛信息

    c语言获取直播吧最近一周nba比赛信息

    这篇文章主要介绍了使用c语言获取直播吧最近一周nba比赛信息的方法,需要的朋友可以参考下
    2014-04-04
  • C语言深入探索递归的特点

    C语言深入探索递归的特点

    程序调⽤⾃⾝的编程技巧称为递归 recursion)函数⾃⼰调⽤⾃⼰就是递归,你也可以理解成是⼀种嵌套结构,但递归分为俩部分,第⼀是“递”,进⼊嵌套结构。第⼆是”归“,最终会⼀步⼀步返回。第⼀次接触递归都会很懵,慢慢理解这个过程就明⽩了
    2022-06-06
  • C++使用宏实现动态库加载

    C++使用宏实现动态库加载

    开发的时候,有些项目不能静态链接动态库,需要程序运行时加载动态库。本文将使用宏来实现动态库的加载,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12

最新评论