【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
文章目录
- 【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
- 一、遍历
- 二、双指针
- 总结
一、遍历
- 先遍历统计链表长度,记为 n
- 设置一个指针走(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):使用了常数大小的额外空间
二、双指针
使用双指针可以不用统计链表长度
- 初始化:前指针 former、后指针 latter,双指针都指向头结点 head
- 构建双指针距离:前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)
- 双指针共同移动:循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾结点时跳出(跳出后,latter 与尾结点距离为 k - 1,即 latter 指向倒数第 k 个结点)
- 返回值:返回 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个节点相关推荐
- leetcode 剑指 Offer 22. 链表中倒数第k个节点
题目描述: 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3 ...
- 【每日一题】剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点
- 力扣—— 19. 删除链表的倒数第 N 个结点(java)、剑指 Offer 22. 链表中倒数第k个节点(java)
19. 删除链表的倒数第 N 个结点(java) 一.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 输入:head = [1,2,3 ...
- 剑指offer——22.链表中倒数第k个节点
题目: 输入一个链表,输出该链表中倒数第k个结点. 知识点: 注意这种想法:找倒数第几个.中间的数或三分之一的数这种题,可以利用两个指针,通过指针移动的不同方式来实现 注意: 还是考虑的情况要周全,此 ...
- 剑指 Offer 22. 链表中倒数第k个节点(C语言)
输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3.4.5.6 ...
- 【双100%解法】剑指 Offer 22. 链表中倒数第k个节点
立志用最少的代码做最高效的表达 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的 ...
- 【算法】剑指 Offer 22. 链表中倒数第k个节点
1.概述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1.2.3. ...
- 剑指 Offer 22. 链表中倒数第k个节点
双指针,间隔k-1,当前面的指针到最后一个节点时,输出后面的指针. class Solution {public ListNode getKthFromEnd(ListNode head, int k ...
- LeetCode-剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点 思路一:利用快慢双指针 /*** Definition for singly-linked list.* struct ListNode {* int ...
最新文章
- es的聚合mysql聚合速度_Elasticsearch(8) --- 聚合查询(Metric聚合)
- c语言如何输入汉字_C语言入门的第一个小程序
- python主要运用于-Python八大主要应用领域,你都知道吗?
- Python 3.5将支持Async/Await异步编程
- 蓝桥杯-填空题-门牌制作
- 使用anconada 的conda更换环境
- 组策略里更改更新和设置客户端首页
- php分页基于oracle,PHP实现的oracle分页函数实例
- 理解包装类 Integer 的底层实现,教你破解所有面试难题!
- linux 命令大全_【Linux】命令目录大全
- 为什么有的PLC需要上电停止功能,能防止PLC变砖,可编程控制器 上电停止 串口通信 梯形图
- 读书笔记——自己动手写网络爬虫--图的优先遍历
- matlab 求反余弦,matlab中反余弦函数
- nodejs爬虫抓取搜狗微信文章详解
- python windows 下设置文件锁、多线程
- Linux —— wget -qO- 命令详解
- 棒棒的二维数据可视化分类模型
- 计算机网络物联,物联网计算机网络安全及控制
- java E201_01_05鬼谷算题
- 活动到期,后台数据列表的状态栏自动变为失效
热门文章
- oracle startup作用,【学习笔记】Oracle打补丁后startup migrate、startup upgrade区别分析...
- 动态排名系统(整体二分)
- windows doc快捷键
- 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误
- HBase 中文文档0.97
- 4.设计模式---单例模式(上)
- Struts1 生成Action请求的几种方式分析
- java 蓝桥杯算法训练 特殊的数字四十
- ppt手动放映怎么设置_一键解决PPT的动画播放和动画排序问题!
- pdo mysql limit_PHP mysql中limit用法详解(代码示例)