题目

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

思路1(栈)

  • 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了

代码

class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
LinkedList<ListNode> stack = new LinkedList<>(); // 把整个链表入栈
while (head != null) {
stack.push(head);
head = head.next;
} // 先将前n-1个元素出栈
for (int i = 1; i < k; i++) {
stack.pop();
} // 此时位于栈顶的就是倒数第k个元素啦
return stack.pop();
}
}1

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\),使用栈的额外空间要花掉\(O(N)\)

思路2(递归+回溯)

  • 使用栈的思想差不多。。
  • 先递归到链表末尾,然后依次回溯,回溯k次的时候就得到我们需要的节点了

代码

class Solution {
ListNode res;
// 代表当前处于倒数第几个节点
int cur = 0; public ListNode getKthFromEnd(ListNode head, int k) {
dfs(head, k);
return res;
} public void dfs(ListNode node, int k) {
// 先递归到末尾
if (node == null) {
return;
} dfs(node.next, k); // 倒数第cur个节点
cur++;
// 等于k代表找到了
if (cur == k) {
res = node;
}
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\),需要递归整个链表

思路3(双指针)

  • 定义fast快指针和slow慢指针两个指针:让快指针fast先走k步,然后再让两个指针同时移动,等快指针fast走道链表末尾时候(为null),此时慢指针slow所指向的节点就是倒数第k个节点

代码

class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head;
ListNode slow = head; // 让快指针先走k步,和慢指针相差k个距离
for (int i = k; i > 0; i--) {
fast = fast.next;
} // 此时让慢指针和快指针同时走,知道快指针到达链表末尾为null时,慢指针就在倒数第k个位置上了
while (fast != null) {
fast = fast.next;
slow = slow.next;
} // 直接返回慢指针即为答案
return slow;
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

思路4(差值法)

  • 因为要求的是倒数第k个节点,那如果我们知道了链表的总长度,那么这个节点在链表中的顺序位置也就知道了
  • 先计算出链表的总长度,则可以得出:倒数第k个节点 等于 链表总长度-k+1。但是在题目中我们已经指向了链表的第一个节点,所以只需要再走n-k个节点即可到达倒数第k个节点

代码

class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int length = 0;
ListNode p = head; // 先获取链表的总长度
while (p != null) {
p = p.next;
length++;
} // 其实倒数第k个的位置就相当于 length-k
// 然后我们从链表头部开始遍历 length-k 个节点,此时所在的节点位置就是答案了
k = length - k;
for (int i = k; i > 0; i--) {
head = head.next;
} return head;
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

力扣 - 剑指 Offer 22. 链表中倒数第k个节点的更多相关文章

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

    剑指 Offer 22. 链表中倒数第k个节点 Offer 22 常规解法 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可. package com.walega ...

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

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

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

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

  4. 【剑指Offer】链表中倒数第k个节点 解题报告(Python)

    [剑指Offer]链表中倒数第k个节点 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  5. 力扣题解-面试题22. 链表中倒数第K个节点

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

  6. 【Java】 剑指offer(22) 链表中倒数第k个结点

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...

  7. [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:  两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ...

  8. 剑指OFFER之链表中倒数第k个节点(九度OJ1517)

    题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<= ...

  9. 【剑指offer】链表中倒数第k个节点,C++实现(链表)

    1.题目 输入一个链表,输出该链表中倒数第k个结点.链表的尾节点是倒数第一个节点. struct ListNode { int val; struct ListNode *next; } 2.思路   ...

随机推荐

  1. Windows10系统下Java JDK下载、安装与环境变量配置(全网最全步骤)

    1.首先要明确: JDK.JRE.JVM的含义 2.下载目前最新的JDK:Java SE Development Kit 17,传送门::https://www.oracle.com/java/tec ...

  2. NOIP模拟74

    前言 我就想说一句,T3 给了一个什么牛马大样例!!!!!!!!,气\(^{TM}\)死我!!!!!!! 我的 \(\mathcal{O}(n)\) 算法始终过不掉大样例我 TM ,要不然我就直接上矩 ...

  3. Spring Bean装配笔记

    Spring Bean装配笔记 Spring中的Bean是一个很重要的概念.Spring作为一个Bean容器,它可以管理对象和对象之间的依赖关系,我们不需要自己建立对象,把这部分工作全部转交给容器完成 ...

  4. hdu4479 (数学题)(算术基本定理)

    题目大意 给定一个三元组\((x,y,z)\)的\(gcd\)和\(lcm\),求可能的三元组的数量是多少,其中三元组是的具有顺序的 其中\(gcd\)和\(lcm\)都是32位整数范围之内 由算术基 ...

  5. [spring-rabbit]自动配置原理

    1 一个简单的示例 在Spring Boot项目中使用spring-rabbit时,需要经过以下几个步骤: 引入依赖. 配置基本连接信息. 创建消息发布者,并发送消息. 创建消息消费者,监听消息并处理 ...

  6. Java多线程编程实战指南 设计模式 读书笔记

    线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...

  7. C 输入输出函数

    流 就C程序而言,所有的I/O操作只是简单地从程序移入或移出字节的事情.这种字节流便称为流( stream ). 绝大多数流是完全缓存的,这意味着"读取"和"写入&quo ...

  8. 8086的复位与启动 CPU执行指令的步骤

    东北大学-计算机硬件技术基础 CPU执行指令的步骤 取指令 Fetch 指令译码 Decode 执行指令 Execute 回写 Write-back 修改指令指针 取指令 将CS和IP的内容通过地址加 ...

  9. fastjson及其反序列化分析--TemplatesImpl

    fastjson及其反序列化分析 源码取自 https://www.github.com/ZH3FENG/PoCs-fastjson1241 参考 (23条消息) Json详解以及fastjson使用 ...

  10. javascript-jquery对象的属性处理

    1.attr()方法:获取元素某个属性的值. $("img").attr("title");//获得第一个<img>元素的title属性 $(&qu ...