寻找链表的倒数第k个节点

题目:已知一个带有表头结点的单链表,节点结构为(data,next),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的节点(k为正整数),若查找成功,返回指向该节点的指针;否则,返回nullptr。

解法:设置两个指针p1,p2同时指向单链表的表头,令p2向后移动k个节点。下图为k=3的情况

之后同步向后移动p1和p2,当p2为nullptr的时候,p1即为所求。

代码:

struct Node
{
int data;
Node* next;
}; using List = Node*; Node* locateNodeFromBottom(List l, int k)
{
Node* p1 = l;
Node* p2 = l;
//p2向后移动k步
for (int step = 0; step < k && p2 != nullptr; ++step)
p2 = p2->next; //若链表长度小于k,则返回nullptr
if (nullptr == p2)
return nullptr; //同步移动p1和p2,当p2为nullptr时,p1即为所求
while (p2 != nullptr)
{
p2 = p2->next;
p1 = p1->next;
} return p1;
}

时间复杂度:该算法只遍历了一次链表,故算法的时间复杂度为O(n)

最新文章

  1. visual studio installer 打包123
  2. ajax post提交form表单 报400错误 解决方法
  3. Android 开发快速导引:Android程序框架【草】
  4. 缓存技术Redis在C#中的使用及Redis的封装
  5. Fast Member
  6. UDP Client—Linux
  7. text-overflow:ellipsis实现超出隐藏时省略号显示
  8. PV UV
  9. c# 迭代器 与 集合 IEnumerable.GetEnumerator 方法
  10. C++拷贝构造函数详解
  11. gcc编译参数之m32 m64
  12. css清除浮动方法小结
  13. 【Leetcode】无重复字符的最长子串
  14. Flask 验证码 点击验证码刷新
  15. tensorflow学习之(八)使用dropout解决overfitting(过拟合)问题
  16. 朱晔的互联网架构实践心得S1E1:Pilot
  17. xgboost入门与实战
  18. BZOJ5104 Fib数列(二次剩余+BSGS)
  19. Android中Invalidate与postInvalidate的区别&lt;转&gt;
  20. 《JavaWeb从入门到改行》多重外键关系在java中的处理方案

热门文章

  1. [转]Spring Security架构
  2. 【NOIP2016】换教室 题解(期望DP)
  3. ASP.NET Core - 实现Http自定义请求头策略
  4. HTML学习第三天
  5. python中1 is True 的结果为False,is判断与==判断的区别
  6. 在阿里云托管kubernetes上利用 cert-manager 自动签发 TLS 证书[无坑版]
  7. STM32 重启之后程序丢失
  8. Javascript模块化编程(二):AMD规范 (转)
  9. Asp.net Core 3.1 引用ORM工具包 yrjw.ORM.Chimp(EF + dapper + Autofac)使用教程
  10. JavaScript学习系列博客_25_JavaScript 数组(Array)