图解算法——链表中倒数第k个节点
题目来源:
剑指 Offer 22. 链表中倒数第k个节点
题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
拿到该题目,第一想法是:
- 先遍历统计链表长度,记为 n;
- 设置一个指针走 (n-k) 步,即可找到链表倒数第 k个节点。
执行完毕后发现,情况惨不忍睹。时间4ms,内存10.9MB,才击败10.34%的对手。白瞎了我这专业真是。不过冷静下来想一想,也是,这笨办法只要是受过“高等教育”的谁不会?我表弟(高中)说他也会。鄙视........

冷静下来,想一想,确实没有必要进行二次循环。 太浪费时间了。那么如何能在一次循环中就能够找到倒数第k个节点呢???
淦,如果有一把尺子,刚好长度为k,那么在尺子前端顶到链表尾部后,那尺子尾端必然是处于链表的倒数第k个节点处啊,卧槽,那怎么办?
尺子的问题,滑动窗口的问题,卧槽,思路来了,双指针!!!对滴,没错,就是他!
流程:
1、初始化两个指针:latter和former,都指向head;
2、构造出长度为k的尺子:先让former先走k步;
3、一起走:等former走到链表尽头,latter就所在位置就是倒数第k所在位置。
以链表 1->2->3->4->5, 和 k = 2 为例:

初始化双指针:latter = head; former = head;
然后former走第一步:

走第二步:

至此,长度为k 的 尺子构建完毕。
双指针开始同步移动:
走一步

再走一步:

再走一步:

发现没?此时former已经指向NULL了,跳出循环。
由于题目上说倒数第k个要符合习惯。
故,此时latter所指向的节点即是倒数第k个节点,此处k=2。
有些题目上就没有说习惯的问题,所以former指针到底先走几步,到哪停,要也别注意,也要灵活运用。

或者:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* former = head;
ListNode* latter = head;
int n = 1;
if(head==NULL)
return NULL;
while(k--){
former = former->next;
}
while(former!=NULL)
{
latter = latter->next;
former = former->next;
}
return latter ;
}
};
Over......
图解算法——链表中倒数第k个节点的更多相关文章
- LeetCode 剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点 题意 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链表有 6 个 ...
- 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)
题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...
- 链表中倒数第K个节点
问题描述: 找出链表中倒数第K个节点 思路分析: 用两个指针,一前一后,保持k个距离,前面的指针移动到末尾,后面的指针就刚好直到第k个节点, 要考虑到k为0,倒数第k个节点不存在的情况. 参考代码: ...
- 链表中倒数第k个节点(Java)
链表中倒数第k个节点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:two-pointers思想,因为是单链表,没法得prevous点,直接遍历得到链表长度再重新遍历效率很低. 采用双指 ...
- 《剑指offer》 链表中倒数第k个节点
本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历 ...
- 剑指offer(14)链表中倒数第K个节点
题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...
- 15:链表中倒数第K个节点
/** * 面试题15:链表中倒数第K个节点 * 输入一个链表,输出该链表中倒数第k个结点. */ public class _15_linked_K { public static void mai ...
- php实现求链表中倒数第k个节点
php实现求链表中倒数第k个节点 一.总结 $head = $head->next; //1.将$head节点next域里面的记录的那个地址值($head节点的下一个节点的地址)给$head,$ ...
- 【剑指offer】面试题 22. 链表中倒数第 K 个节点
面试题 22. 链表中倒数第 K 个节点
随机推荐
- toad for oracle自定义快捷sql
View--->Toad Options--->Behavior--->Auto replace--->
- 创建Django REST framework工程
1.创建工程虚拟环境 2.创建工程目录和调整目录结构: 创建Django的项目 创建docs 用于存放一些说明文档资料 创建scripts 用于存放管理脚本文件 创建logs 用于存在日志 在与项目同 ...
- Gradle使用及配置
构建工具:Gradle(6.8) 下载地址:https://gradle.org/releases/ 下载最新版的二进制文件即可,下载"gradle-6.8.1-bin.zip文件,下载后完 ...
- 解决maven中某些依赖无法下载,手动安装Maven依赖
<!--先下载jar包,然后在仓库中手动安装,下面是遇到的两个例子--> <!--第一个--> mvn install:install-file -Dfile=D:\kaptc ...
- flask文件下载
后端的代码 # coding:utf-8 from flask import Flask app = Flask(__name__) @app.route("/upload", m ...
- MySQL的双主配置
配置MySQL双主配置,需要先配置MySQL的主从复制,传送门: 0.集群规划 hadoop105 hadoop106 hadoop107 MySQL(master,slave) MySQL(slav ...
- Feign配置日志的打印级别
一.细粒度的配置Feign的日志级别(针对每个微服务配置) 1.java代码方式 (1)在Feign接口注解上面配置configuration /** * @author : maybesuch * ...
- FridaHook框架学习(1)
FridaHook框架学习(1) 前言 本次学习过程参考https://bbs.pediy.com/thread-227232.htm Frida安装与使用 Windows端安装 pip instal ...
- 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定
前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...
- 1.DHCP的定义
1.Dynamic Host Configuration Protocol (DHCP)是一种客户端/服务器协议,可自动向Internet协议(IP)主机提供其IP地址和其他相关配置信息,例如子网掩码 ...