经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++解决输出链表中倒数k个结点的问题
来源:jb51  时间:2021/12/15 9:11:47  对本文有异议

题目描述

输入一个长度为 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个结点。

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

测试代码

  1. /**
  2. * struct ListNode {
  3. * int val;
  4. * struct ListNode *next;
  5. * ListNode(int x) : val(x), next(nullptr) {}
  6. * };
  7. */
  8. class Solution {
  9. public:
  10. /**
  11. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  12. *
  13. *
  14. * @param pHead ListNode类
  15. * @param k int整型
  16. * @return ListNode类
  17. */
  18. ListNode* FindKthToTail(ListNode* pHead, int k) {
  19. // 空链表直接返回
  20. if(pHead == NULL)
  21. return pHead;
  22. // 快慢指针
  23. ListNode *fast = pHead;
  24. ListNode *slow = pHead;
  25. // 让快指针先走k步
  26. while(k--)
  27. {
  28. if(fast == NULL)
  29. return NULL;
  30. fast = fast->next;
  31. }
  32. // 当快指针走完时,慢指针的位置就是倒数第k个结点
  33. while(fast != NULL)
  34. {
  35. fast = fast->next;
  36. slow = slow->next;
  37. }
  38. return slow;
  39. }
  40. };

补充

第二种实现方法:

  1. /**
  2. * struct ListNode {
  3. * int val;
  4. * struct ListNode *next;
  5. * ListNode(int x) : val(x), next(nullptr) {}
  6. * };
  7. */
  8. class Solution {
  9. public:
  10. /**
  11. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  12. *
  13. *
  14. * @param pHead ListNode类
  15. * @param k int整型
  16. * @return ListNode类
  17. */
  18. ListNode* FindKthToTail(ListNode* pHead, int k) {
  19. // write code here
  20. ListNode* p=pHead;
  21. ListNode* q=pHead;
  22. if(pHead==NULL)return NULL;
  23. while(k--)
  24. {
  25. if(q==NULL)return NULL;
  26. q=q->next;
  27. //k--;
  28. }
  29. //if(q==NULL)return pHead;
  30. while(q)
  31. {
  32. p=p->next;
  33. q=q->next;
  34. }
  35. return p;
  36. }
  37. };

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号