算法打卡Day14_剑指offer22 链表中倒数第k个节点

简介: 算法打卡Day14_剑指offer22 链表中倒数第k个节点

剑指offer 原题

热度 【美团】

输入一个链表,输出该链表中倒数第k个节点,为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点,

例如,一个链表有6个节点,从头节点开始,他们的值依次是1、2、3、4、5、6.这 个链表的倒数第3个节点的值是值为4的节点。

思路

方法一 hash表获取

我们将遍历链表以后将数值存入hash表。《位置,节点》、然后计数出倒数的是第几个节点,如n是链表的长度,要求取到倒数第k个数,那么倒过来计算正数的值就是

n-k+1。 直接去hash.get(n-k+1).得到节点值。

时间复杂度为O【n】.

空间复杂度为O【n】

方法二 快慢指针

如果要求时间复杂度是O(n),空间复杂度是o(1) 。那么hash就 不符合要求了。这时就得另辟蹊径。


这个时候我们,想到了使用快慢指针的方式。快慢指针首先都同时指向链表头head。若我们要取倒数第2个节点的值。,设k=2 .那么快指针先走k-1步。即快指针先移动(2-1)=1步。

20200401134307494.png

然后此时慢指针始终笔快指针慢1步。快慢指针同时移动,直到快指针到达链表尾部时。慢指针恰好指向链表后的倒数第2个节点。我们刚好能取到倒数第2个节点的值

20200401134307494.png

这方法还真是巧妙至极,简直是妙蛙种子走进了家了,妙妙妙啊 ~

有兴趣的老爷,还可以关注我的公众号【一起收破烂】,回复【006】获取 最新java面试资料以及简历模型120套哦~

相关文章
|
25天前
|
算法
【C算法】链表算法
【C算法】链表算法
|
23天前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
23天前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
24天前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
19天前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
22天前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
10 0
|
22天前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
10 0
|
22天前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
9 0
|
22天前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
13 0
|
30天前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
40 0
下一篇
DDNS