题目来源:

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

leetCode

题目描述:

输入一个链表,输出该链表中倒数第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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

拿到该题目,第一想法是:

  1. 先遍历统计链表长度,记为 n;
  2. 设置一个指针走 (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个节点的更多相关文章

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

    剑指 Offer 22. 链表中倒数第k个节点 题意 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. ​ 例如,一个链表有 6 个 ...

  2. 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)

    题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...

  3. 链表中倒数第K个节点

    问题描述: 找出链表中倒数第K个节点 思路分析: 用两个指针,一前一后,保持k个距离,前面的指针移动到末尾,后面的指针就刚好直到第k个节点, 要考虑到k为0,倒数第k个节点不存在的情况. 参考代码: ...

  4. 链表中倒数第k个节点(Java)

    链表中倒数第k个节点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:two-pointers思想,因为是单链表,没法得prevous点,直接遍历得到链表长度再重新遍历效率很低. 采用双指 ...

  5. 《剑指offer》 链表中倒数第k个节点

    本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历 ...

  6. 剑指offer(14)链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...

  7. 15:链表中倒数第K个节点

    /** * 面试题15:链表中倒数第K个节点 * 输入一个链表,输出该链表中倒数第k个结点. */ public class _15_linked_K { public static void mai ...

  8. php实现求链表中倒数第k个节点

    php实现求链表中倒数第k个节点 一.总结 $head = $head->next; //1.将$head节点next域里面的记录的那个地址值($head节点的下一个节点的地址)给$head,$ ...

  9. 【剑指offer】面试题 22. 链表中倒数第 K 个节点

    面试题 22. 链表中倒数第 K 个节点

随机推荐

  1. toad for oracle自定义快捷sql

    View--->Toad Options--->Behavior--->Auto replace--->

  2. 创建Django REST framework工程

    1.创建工程虚拟环境 2.创建工程目录和调整目录结构: 创建Django的项目 创建docs 用于存放一些说明文档资料 创建scripts 用于存放管理脚本文件 创建logs 用于存在日志 在与项目同 ...

  3. Gradle使用及配置

    构建工具:Gradle(6.8) 下载地址:https://gradle.org/releases/ 下载最新版的二进制文件即可,下载"gradle-6.8.1-bin.zip文件,下载后完 ...

  4. 解决maven中某些依赖无法下载,手动安装Maven依赖

    <!--先下载jar包,然后在仓库中手动安装,下面是遇到的两个例子--> <!--第一个--> mvn install:install-file -Dfile=D:\kaptc ...

  5. flask文件下载

    后端的代码 # coding:utf-8 from flask import Flask app = Flask(__name__) @app.route("/upload", m ...

  6. MySQL的双主配置

    配置MySQL双主配置,需要先配置MySQL的主从复制,传送门: 0.集群规划 hadoop105 hadoop106 hadoop107 MySQL(master,slave) MySQL(slav ...

  7. Feign配置日志的打印级别

    一.细粒度的配置Feign的日志级别(针对每个微服务配置) 1.java代码方式 (1)在Feign接口注解上面配置configuration /** * @author : maybesuch * ...

  8. FridaHook框架学习(1)

    FridaHook框架学习(1) 前言 本次学习过程参考https://bbs.pediy.com/thread-227232.htm Frida安装与使用 Windows端安装 pip instal ...

  9. 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

    前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...

  10. 1.DHCP的定义

    1.Dynamic Host Configuration Protocol (DHCP)是一种客户端/服务器协议,可自动向Internet协议(IP)主机提供其IP地址和其他相关配置信息,例如子网掩码 ...