剑指Offer—编程题15(链表中倒数第k个结点)

2024-06-24 08:32

本文主要是介绍剑指Offer—编程题15(链表中倒数第k个结点),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:输入一个链表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点.

public static class ListNode {int value;ListNode next;
}

解题思路:

为了实现只遍历链表一次就能找到倒数第k 个结点,我们可以定义两 
个指针。第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动;从第k 步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1 , 当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k 个结点。

代码实现:

public class Test15 {public static class ListNode {int value;ListNode next;}/*** 输入一个键表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,* 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,* 从头结点开始它们的值依次是1、2、3、4、5 6。这个链表的倒数第3个结点是值为4的结点.** @param head 链表的头结点* @param k    倒数第k个结点* @return 倒数第k个结点*/public static ListNode findKthToTail(ListNode head, int k) {// 输入的链表不能为空,并且k大于0if (k < 1 || head == null) {return null;}// 指向头结点ListNode pointer = head;// 倒数第k个结点与倒数第一个结点相隔k-1个位置// pointer先走k-1个位置for (int i = 1; i < k; i++) {// 说明还有结点if (pointer.next != null) {pointer = pointer.next;}// 已经没有节点了,但是i还没有到达k-1说明k太大,链表中没有那么多的元素else {// 返回结果return null;}}// pointer还没有走到链表的末尾,那么pointer和head一起走,// 当pointer走到最后一个结点即,pointer.next=null时,head就是倒数第k个结点while (pointer.next != null) {head = head.next;pointer = pointer.next;}// 返回结果return head;}public static void main(String[] args) {ListNode head = new ListNode();head.value = 1;head.next = new ListNode();head.next.value = 2;head.next.next = new ListNode();head.next.next.value = 3;head.next.next.next = new ListNode();head.next.next.next.value = 4;head.next.next.next.next = new ListNode();head.next.next.next.next.value = 5;head.next.next.next.next.next = new ListNode();head.next.next.next.next.next.value = 6;head.next.next.next.next.next.next = new ListNode();head.next.next.next.next.next.next.value = 7;head.next.next.next.next.next.next.next = new ListNode();head.next.next.next.next.next.next.next.value = 8;head.next.next.next.next.next.next.next.next = new ListNode();head.next.next.next.next.next.next.next.next.value = 9;System.out.println(findKthToTail(head, 1).value); // 倒数第一个System.out.println(findKthToTail(head, 5).value); // 中间的一个System.out.println(findKthToTail(head, 9).value); // 倒数最后一个就是顺数第一个System.out.println(findKthToTail(head, 10));}
}


这里写图片描述

这篇关于剑指Offer—编程题15(链表中倒数第k个结点)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089636

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与