【LeetCode】剑指 Offer 22. 链表中倒数第k个节点

文章目录

  • 【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
  • 一、遍历
  • 二、双指针
  • 总结

一、遍历

  1. 先遍历统计链表长度,记为 n
  2. 设置一个指针走(n - k)步,即可找到链表倒数第 k 个结点
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode getKthFromEnd(ListNode head, int k) {//1、遍历链表,记录结点数 nListNode temp = head;int n = 1;while(temp.next != null){temp = temp.next;n++;}//2、倒数第 k 个结点即为正数第 n - k + 1 个temp = head;for(int i = 0; i < n - k; i++){temp = temp.next;}ListNode newHead = temp;ListNode proxy = temp.next;newHead.next = proxy;while(temp.next != null){proxy = temp.next;proxy = proxy.next;temp = temp.next;}return newHead;}
}
  • 时间复杂度 O(n):n 为链表长度,使用了 3 次循环,但是并没有嵌套
  • 空间复杂度 O(1):使用了常数大小的额外空间

二、双指针

使用双指针可以不用统计链表长度

  1. 初始化:前指针 former、后指针 latter,双指针都指向头结点 head
  2. 构建双指针距离:前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)
  3. 双指针共同移动:循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾结点时跳出(跳出后,latter 与尾结点距离为 k - 1,即 latter 指向倒数第 k 个结点)
  4. 返回值:返回 latter 即可
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode getKthFromEnd(ListNode head, int k) {ListNode former = head;ListNode latter = head;for(int i = 0; i< k; i++){former = former.next;}while(former != null){former = former.next;latter = latter.next;}return latter;}
}
  • 时间复杂度 O(n):n 为链表长度。总体看,former 走了 n 步,latter 走了(n - k)步
  • 空间复杂度 O(1):双指针 former,latter 使用常数大小的额外空间

总结

第一种方法很容易就能想出来,关键是第二种方法,使用了双指针只需要遍历数组一次,非常巧妙,值得学习

【LeetCode】剑指 Offer 22. 链表中倒数第k个节点相关推荐

  1. leetcode 剑指 Offer 22. 链表中倒数第k个节点

    题目描述: 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3 ...

  2. 【每日一题】剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点

  3. 力扣—— 19. 删除链表的倒数第 N 个结点(java)、剑指 Offer 22. 链表中倒数第k个节点(java)

    19. 删除链表的倒数第 N 个结点(java) 一.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 输入:head = [1,2,3 ...

  4. 剑指offer——22.链表中倒数第k个节点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 知识点: 注意这种想法:找倒数第几个.中间的数或三分之一的数这种题,可以利用两个指针,通过指针移动的不同方式来实现 注意: 还是考虑的情况要周全,此 ...

  5. 剑指 Offer 22. 链表中倒数第k个节点(C语言)

    输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3.4.5.6 ...

  6. 【双100%解法】剑指 Offer 22. 链表中倒数第k个节点

    立志用最少的代码做最高效的表达 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的 ...

  7. 【算法】剑指 Offer 22. 链表中倒数第k个节点

    1.概述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3. ...

  8. 剑指 Offer 22. 链表中倒数第k个节点

    双指针,间隔k-1,当前面的指针到最后一个节点时,输出后面的指针. class Solution {public ListNode getKthFromEnd(ListNode head, int k ...

  9. LeetCode-剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 思路一:利用快慢双指针 /*** Definition for singly-linked list.* struct ListNode {* int ...

最新文章

  1. es的聚合mysql聚合速度_Elasticsearch(8) --- 聚合查询(Metric聚合)
  2. c语言如何输入汉字_C语言入门的第一个小程序
  3. python主要运用于-Python八大主要应用领域,你都知道吗?
  4. Python 3.5将支持Async/Await异步编程
  5. 蓝桥杯-填空题-门牌制作
  6. 使用anconada 的conda更换环境
  7. 组策略里更改更新和设置客户端首页
  8. php分页基于oracle,PHP实现的oracle分页函数实例
  9. 理解包装类 Integer 的底层实现,教你破解所有面试难题!
  10. linux 命令大全_【Linux】命令目录大全
  11. 为什么有的PLC需要上电停止功能,能防止PLC变砖,可编程控制器 上电停止 串口通信 梯形图
  12. 读书笔记——自己动手写网络爬虫--图的优先遍历
  13. matlab 求反余弦,matlab中反余弦函数
  14. nodejs爬虫抓取搜狗微信文章详解
  15. python windows 下设置文件锁、多线程
  16. Linux —— wget -qO- 命令详解
  17. 棒棒的二维数据可视化分类模型
  18. 计算机网络物联,物联网计算机网络安全及控制
  19. java E201_01_05鬼谷算题
  20. 活动到期,后台数据列表的状态栏自动变为失效

热门文章

  1. oracle startup作用,【学习笔记】Oracle打补丁后startup migrate、startup upgrade区别分析...
  2. 动态排名系统(整体二分)
  3. windows doc快捷键
  4. 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误
  5. HBase 中文文档0.97
  6. 4.设计模式---单例模式(上)
  7. Struts1 生成Action请求的几种方式分析
  8. java 蓝桥杯算法训练 特殊的数字四十
  9. ppt手动放映怎么设置_一键解决PPT的动画播放和动画排序问题!
  10. pdo mysql limit_PHP mysql中limit用法详解(代码示例)